2016-06-07 4 views
0

Temporäre Ignorierung vorbereiteter Anweisungen und andere Methoden, um die Einfügung in eine Datenbank durchzuführen, was ist der beste Weg, die Eingabe zu bereinigen, bevor sie eingefügt wird?Sicherster moderner Filter für Datenbankeinfügung?

function filter($s) { return htmlentities(addslashes($s)); }

oder

function filter($t) { return mysqli_real_escape_string($t); }

+0

In diesem Fall ist mysqli_real_escape_string **, aber ** Bindungsparameter zu vorbereiteten Anweisungen viel besser: http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php – CD001

+0

'mysqli_real_escape_string' ist immer noch die bessere Methode, aber es ist schrecklich im Vergleich zur richtigen Verwendung von vorbereiteten Aussagen. In modernen SQL-Anwendungen sollte keine Form des String-Escaping toleriert werden. – Chris

+1

'htmlentities' ist total falsch.Der einzige Zweck besteht darin, HTML zu entschlüsseln, wenn es auf einer Webseite angezeigt wird, es hat nichts mit Datenbanken zu tun. – Barmar

Antwort

2

Vorübergehend ignoriert vorbereitete Anweisungen und andere Weise tatsächlich das Einfügen in eine Datenbank zu tun,

Okay, lassen Sie uns Best Practices setzen, die tatsächlich erreichen Sicherheit beiseite ...

Was ist die beste aktuelle Art der Bereinigung der Eingabe, bevor es eingefügt wird?

Dies ist eine kuriose Frage! Wenn Sie mysqli haben, können Sie vorbereitete Aussagen verwenden, so verstehe ich nicht den Grund, warum jemand sie nicht verwenden würde?

Zugegeben, es gibt eine Reihe von Anwendungsfällen, in denen Sie Benutzerdaten akzeptieren und sie mit einer SQL-Abfrage kombinieren müssen. LIMIT $foo ist ein klassisches Beispiel (einfachste Lösung: Verwenden Sie PHP 7 und akzeptieren Sie nur einen int für diesen Parameter).

Ein anderes Beispiel ist SELECT * FROM table WHERE id IN (2, 3, 4, 5). Wiederum wird durch die Umwandlung von Benutzereingaben in eine Ganzzahl der größte Teil der Angriffsfläche entfernt.

Ganzzahlen sind einfach. Was ist mit Saiten?

Nun, read this at least once. Sie sollten mit Zeichensatzangriffen vertraut sein und sicher sein, dass Sie einen sicheren Zeichensatz verwenden.

Solange Sie den vorgeschriebenen Rat befolgen, ja, können Sie sicher mysqli_real_escape_string() oder PDO::quote() verwenden.

Aber im Ernst, verwenden Sie vorbereitete Aussagen. Sie sind weniger wahrscheinlich, einen Fehler zu machen, wenn Sie separate data from code.

function filter($s) { 
    return htmlentities(addslashes($s)); 
} 

nicht nur zu verhindern, dass SQLi dies eine schlechte Idee ist, es ist ein bad idea to attempt to strip XSS on insert.

Abschließend sind SQLi und XSS Probleme gelöst, und die Werkzeuge und Strategien für preventing SQLi und die Werkzeuge für preventing XSS haben praktisch keine Überlappung. Verwirren Sie sie auf eigene Gefahr.

Verwandte Themen