Schützt mysql_real_escape_string () VOLLSTÄNDIG vor SQL-Injection?

Auf http://www.justinshatchtuck.com/2007/01/18/mysql-injection-cheat-sheet/?akst_action=share-dies gibt es einen Abschnitt, der behauptet, dass Sie mysql_real_escape_string mit bestimmten asiatischen Zeichenkodierungen umgehen können

Umgehen von mysql_real_escape_string () mit BIG5 oder GBK

“Injektionsstrang”
に 関 す る 情報:

Die obigen Zeichen sind chinesische Big5

Ist das wirklich wahr? Und wenn ja, wie würden Sie Ihre Website davor schützen, wenn Sie keinen Zugang zu vorbereiteten Aussagen hätten?

    Laut Stefan Esser ist mysql_real_escape_string() [ist] nicht sicher, wenn SET NAMES verwendet wird.”

    Seine Erklärung, von seinem Blog :

    SET NAMES wird normalerweise verwendet, um die Codierung vom Standard auf die von der Anwendung benötigte umzustellen. Dies geschieht so, dass mysql_real_escape_string nichts weiß. Das bedeutet, wenn Sie zu einer Multi-Byte-Kodierung wechseln, die Backslash als 2. 3. 4. Byte erlaubt, geraten Sie in Schwierigkeiten, weil mysql_real_escape_string nicht korrekt entweicht. UTF-8 ist sicher …

    Sicherer Weg, die Kodierung zu ändern, ist mysql_set_charset , aber das ist nur in neuen PHP-Versionen verfügbar

    Er erwähnt jedoch, dass UTF-8 sicher ist.

    Dies ist ein MySQL-Server-Bug, der Berichten zufolge bereits im Mai 2006 behoben wurde.

    Sehen:

    • MySQL-Fehler # 8303 : String-Literale mit Multi-Byte-Zeichen, die \ enthalten, sind falsch gelehrt
    • MySQL Fehler # 8317 : Zeichensatz- Einf \ u00FChrer in Abfrage kann Verbindungszeichensatz nicht überschreiben
    • MySQL Fehler # 8378 : String ist mit Client-Zeichensatz ‘gbk’ falsch entsprungen
    • MySQL 5.1.11 changelog.

    Der Fehler wurde in MySQL 4.1.20, 5.0.22, 5.1.11 behoben.

    Stellen Sie bei Verwendung von 4.1.x, 5.0.x oder 5.1.x sicher, dass Sie mindestens auf die kleineren Revisionsnummern aktualisiert haben.

    Um dieses NO_BACKSLASH_ESCAPES , können Sie auch den SQL-Modus NO_BACKSLASH_ESCAPES aktivieren, der den NO_BACKSLASH_ESCAPES Schrägstrich als Anführungszeichen deaktiviert.

    Ich bin mir ziemlich sicher, dass es nur nicht funktioniert, wenn Sie SQL verwenden, um die Zeichencodierung zu ändern.

    Wie andere gezeigt haben, kann mysql_real_escape_string() in obskuren mysql_real_escape_string() umgangen werden . Das ist eine bekannte Strategie zur Umgehung der Escape-Logik, aber es könnte andere unbekannte Sicherheitslücken geben, die noch nicht entdeckt wurden.

    Der einfache und effektive Weg, um SQL-Injection in PHP zu verhindern, ist die Verwendung von vorbereiteten statementen, wo Sie können, und eine sehr strenge Whitelist, wo Sie nicht können.

    Vorbereitete statementen, die vom PDO-Treiber tatsächlich verwendet und nicht emuliert werden, sind nachweislich sicher (zumindest in Bezug auf SQL-Injection), da sie ein grundlegendes Problem der Anwendungssicherheit lösen: Sie trennen die Daten von den statementen , die auf den Daten basieren. Sie werden in getrennten Paketen gesendet; Die parametrisierten Werte haben nie die Möglichkeit, die Abfragezeichenfolge zu beeinträchtigen.

    Es ist 2015. Entkomme und verkette nicht mehr. Sie sollten Ihre Eingaben immer noch gemäß der Anwendungslogik (und Geschäftslogik) validieren, aber nur vorbereitete statementen verwenden.