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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top