Der beste Weg zu Desinfizieren / Filter Nutzer-Kommentare?
Frage
Ich bin derzeit mit diesem Prozess zu Desinfizieren / Filter Kommentar von Nutzern eingegeben ->
Diese wird verwendet Schrägstriche abzustreifen ... und
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
Dann geht der Kommentar durch diese Funktion, um die Daten zu sanieren ...
function my_strip_tags($str) {
$strs=explode('<',$str);
$res=$strs[0];
for($i=1;$i<count($strs);$i++)
{
if(!strpos($strs[$i],'>'))
$res = $res.'<'.$strs[$i];
else
$res = $res.'<'.$strs[$i];
}
return strip_tags($res);
}
Danach geht es direkt in die Datenbank vorbereitete Anweisung ..
function add_comment($comment,$type,$update_id,$user_id){
$query="INSERT INTO comment_updates (updateid,userid,comment) VALUES(?,?,?)";
if($stmt=$this->conn->prepare($query)) {
$stmt->bind_param('sss',$update_id,$user_id,$comment);
$stmt->execute();
if($this->conn->affected_rows==1){
$stmt->close();
return true;
}
}
}
Ich wollte nur wissen, ob dies sicher genug ist oder wenn sie noch andere besseren Alternativen ... Danke
Lösung
Sie Ihre eigenen HTML Sanitizer nicht schreiben. Sie werden XSS-Lücken schaffen.
Wenn Sie vorhaben, Ihre eigenen zu schreiben, zumindest laufen die ha.ckers.org xss smoketests dagegen
Zwischen diesen Tests und die HTMLPurifier Vergleich von Filtern , sollten Sie in der Lage sein, eine gute Idee zu erhalten, von , wie kompliziert html sanitization ist -. und warum Sie es den Profis überlassen sollte
Andere Tipps
Das Wichtigste, wenn es um die Speicherung von Daten in eine Datenbank zu denken ist es zu entkommen; mit mysql_real_escape_string
oder mysqli_real_escape_string
oder PDO::quote
auf der DB ab, die Sie‘ re mit (oder anderen Funktionen für oracle / pg /...)
Eine andere Lösung wäre bereit, Aussagen zu verwenden (siehe mysqli::prepare
und / oder PDO::prepare
- die sind nicht von der alten mysql_*
Erweiterung unterstützt) , die mit Flucht Daten an Ihrem befassen; -)
Wenn man über die HTML-Ausgabe zu denken, haben Sie zwei Möglichkeiten:
- HTML akzeptieren und einige Bibliothek verwenden wie HTMLPurifier zu filtern / reinigen; es ermöglicht genau sind erlaubt, welche Tags und Attribute angeben, und geben Ihnen saubere und gültige HTML als Ausgabe.
- versuchen HTML zu entfernen, wie Sie doinig - (? Was ist, wenn Sie irgendeinen speziellen Fall vergessen) nicht immer gut funktioniert
- entkommen HTML, mit
htmlentities
oderIhre magic quotes Handhabung ist in Ordnung, aber wenn Sie Parameter erstellen erhalten mit Zitaten Sie die Schlüssel zu zu stripslashes müssen. :)
Wie für Streifen-Tags, sind Sie besser dran mit einer echten HTML-Filter-Bibliothek. Es gibt so viele Drehungen und Wendungen beteiligt mit HTML, die Sie gerade nichts vertrauen sollten Sie nur einmal machen und vergessen. Die Menschen verbringen Zeit diese HTML-Filter so nutzen, um ihre Arbeit zu Ihrem Vorteil zu machen.
Wie bei „direkt in die DB“, auch in einem gebundenen Parameter, sicher, das ist großartig. Sie können sicher etwas in einen gebundenen Parameter setzen. In einer Zeichenkette mit Anführungszeichen, ich hoffe, dass Sie das Ergebnis sind auf der Flucht.
alle Zeichen entkommen, wenn es in der Datenbank Puting. Beim Aufrufen und Anzeigen stellen Sie sicher, HTML Formatierungen wie <sometag>
zu entkommen, so dass es statt zeigt als Code behandelt werden.
PHP hat wenig bekannt, aber mächtig in sanitären Einrichtungen Funktionen eingebaut. Ich würde empfehlen, sie mit: