Htmlentities vs addslashes vs mysqli_real_escape_string
-
19-09-2019 - |
Frage
Ich habe auf der Sicherung von PHP-Anwendungen einige Lesung zu tun, und es scheint mir, dass mysqli_real_escape_string
ist die korrekte Funktion zu verwenden, wenn Daten in MySQL-Tabellen einfügen, weil addslashes
einige seltsamen Dinge verursachen kann für einen intelligenten Angreifer passieren. Richtig?
Allerdings gibt es eine Sache, die mich ist verwirrend. Ich glaube mich zu erinnern, sich beraten addslashes
besser ist als htmlentities
wenn vom Benutzer eingegebenen Daten zurück an Benutzer Echo ihrer Daten zu schützen, aber es scheint, wie addslashes
das mit der Verwundbarkeit ist. Ist das wahr, oder bin ich die Erinnerung falsch?
Lösung
Es gibt verschiedene Kontexte für Ihre Daten. Der Kontext von Daten in die Datenbank einfügen muss maskiert werden anders als Kontext Rendering html / xml oder sogar eine E-Mail-Nachricht.
Escaping Daten in eine db gehen sollte in allen neuen Code für vorbereitete Anweisungen veraltet. Jeder, der sagt Ihnen etwas anderes ist man einen Bärendienst zu tun.
Escaping Daten an den Browser gehen muss in einer Reihe von verschiedenen Möglichkeiten, maskiert werden, je nach dem Ziel. Manchmal ist htmlspecialchars genug, muss man manchmal auch htmlentities verwenden. Manchmal müssen Sie numerische Einheiten. Es ist ein Thema, das Sie sollten einige der Forschung auf alle Nuancen kennen.
Die allgemeine Regel, die ich lebe validieren (nicht filtern, ablehnen, wenn falsch) -Eingang & entkommen Ausgang (basierend auf Kontext).
Andere Tipps
Sie sind verschiedene Werkzeuge für verschiedene Zwecke.
mysqli_real_escape_string macht Daten sicher für in MySQL Einfügen (aber parametrisierte Abfragen sind besser).
Htmlentities macht Daten sicher zur Ausgabe in ein HTML-Dokument
addslashes macht für einige andere Situationen, Daten sicher, ist aber nicht ausreichend für MySQL
Sie können auch die Verwendung PDO Libs die hat die meisten der entweichenden für Sie, für den Fall, dass Sie PHP5 auf den Servern verwenden.
Ein Echo zurück würde ich persönlich htmlspecialchars vorziehen, aber man könnte mich korrigieren
ja, verwenden Sie die mysqli_real_escape_string oder eine Bibliothek wie PDO auf alle Benutzereingaben. Wenn Echo zurück, verwende ich htmlentities mit ENT_QUOTES als zweiten Parameter, da sie alle geeigneten Zeichen in ihrer HTML-Entities entkommt, einschließlich Anführungszeichen.
Hinweis: Die Verwendung htmlentities () in einem UTF-8-codierten Dokument sollte vermieden werden. Siehe auch:
Achten Sie auf (zitiert von phpwact.org ):
Mit modernen Web-Browsern und widespead Unterstützung für UTF-8, brauchen Sie nicht htmlentities weil alle diese Zeichen können direkt dargestellt werden in UTF-8. Noch wichtiger ist, in Allgemein Browser nur HTML-Unterstützung der Sonderzeichen - ein normaler Text Editor, zum Beispiel, ist nicht bekannt HTML-Entitäten. Je nachdem, was Sie tun, mit htmlentities kann reduzieren die Fähigkeit anderer Systeme „Verbrauchen“ Ihre Inhalte.
Auch (nicht bestätigt, sondern Klänge angemessen - von Anon Kommentar hier), Zeichenentität (Sachen wie »oder -) nicht funktionieren, wenn ein Dokument serviert als application / xml + xhtml (es sei denn, Sie definieren sie). Sie können immer noch weg mit der numerischen Form though.
Eine weitere interessante Lösung für PHP 5.2 und höher ist die Filter-Erweiterung zu verwenden: http://www.php.net/manual/en/book.filter.php
Es ermöglicht Ihnen, Benutzereingaben zu validieren und sanieren. Es gibt viele eingebauten Filter zur Verfügung und sie können mit Fahnen kombiniert werden, ihr Verhalten zu optimieren. Zusätzlich Filter iese können auch zur Validierung / sterilisieren Ints, Schwimmern, E-Mails, bestimmte reguläre Ausdrücke verwendet werden.
Ich persönlich habe mit ihnen in meinen Projekten gestartet Formen und die Ausgabe vom Benutzer eingegebenen Daten zu überprüfen, und ich bin sehr froh, dass ich tat. Obwohl, wenn ich Werte in einer MySQL-Datenbank einfügen, verwende ich vorbereitete Abfragen für zusätzliche Sicherheit. Diese Lösungen können zusammen helfen, die meisten SQL-Injections und XSS-Attacken zu vermeiden.
Sie können nicht eine „Flucht“ Funktion haben und erwarten, dass sie die ganze Zeit zu arbeiten. Es gibt verschiedene Angriffe, die bestimmten Hygiene-Routinen erfordern. Der einzige Weg, dieses Konzept zu verstehen ist etwas anfälligen Code zu schreiben und zu nutzen Sie es dann. Das Schreiben von Code ausnutzen ist von entscheidender Bedeutung für das Verständnis eines Sicherheitssystems.
Zum Beispiel dieser Abfrage ist anfällig für SQL-Injection:
$host=htmlspecialchars($_GET[host],ENT_QUOTES);
$name=htmlspecialchars($_GET[name],ENT_QUOTES);
mysql_query("select * from user where Host='$host' and Name='$name' ");
Exploit: http: //localhost/sqli_test.php host = \ & name =% 20sleep (20) - -% 201
Die beste Escape-Funktion für MySQL ist mysqli_real_escape_string (), aber dies kann fehlschlagen:
mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));
ausschöpfen: http: //localhost/sqli_test.php id = 1% 20or% 20sleep (20)
In der Tat der beste Weg, um Pflege von SQL-Injection zu nehmen ist nicht eine Escape-Funktion aufrufen, seine ADODB die parametrisierte dert für SQL-Injection verwenden. Verwenden Sie htmlspecialcahrs ($ var, ENT_QUTOES) für XSS. Lesen Sie die OWASP Top 10 , weil es als eine ganze Menge mehr ist, kann mit Web schief gehen Anwendungssicherheit.