Frage

Ich möchte eine Funktion als mysql_real_escape_string verhalten haben, ohne auf die Datenbank verbindet, wie ich manchmal trocken Tests ohne DB-Verbindung müssen tun. mysql_escape_string ist veraltet und daher unerwünscht ist. Einige meiner Ergebnisse:

http://www.gamedev.net/community/forums/ topic.asp? topic_id = 448.909

http://w3schools.invisionzone.com/index.php?showtopic=20064

War es hilfreich?

Lösung

Es ist unmöglich, sicher einen String zu verlassen, ohne eine DB-Verbindung. mysql_real_escape_string() und vorbereitete Anweisungen müssen eine Verbindung zu der Datenbank, so dass sie die Zeichenfolge mit dem entsprechenden Zeichensatz entweichen können -. sonst SQL-Injection-Angriffe Multi-Byte-Zeichen nach wie vor möglich sind,

Wenn Sie nur Tests sind , dann können Sie auch mysql_escape_string() verwenden, ist es nicht 100% ig garantiert gegen SQL-Injection-Angriffe, aber es ist unmöglich, etwas sicherer ohne DB-Verbindung aufzubauen.

Andere Tipps

Nun, nach der mysql_real_escape_string Funktion Referenzseite: „mysql_real_escape_string () ruft MySQL-Library-Funktion mysql_real_escape_string, die entkommt die folgenden Zeichen: \ x00, \ n \ r, \,‘, " und \ X1a"

Mit dem im Verstand, dann ist die Funktion in dem zweiten angegebenen Link sollten Sie genau geschrieben tun, was Sie brauchen:

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}

In direktem Gegensatz zu meiner anderen Antwort, dies folgende Funktion wahrscheinlich sicher ist, auch mit Multi-Byte-Zeichen.

// replace any non-ascii character with its hex code.
function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

Ich hoffe, dass jemand mehr Wissen als ich selbst kann mir sagen, warum über den Code wird nicht funktionieren ...

Von weiteren Untersuchungen habe ich gefunden:

http: //dev.mysql .com / doc / refman / 5.1 / de / news-5-1-11.html

Sicherheit Fix:

Eine SQL-Injektion Sicherheitslücke wird in Multi-Byte-Codierungsverarbeitung gefunden worden. Der Fehler war in dem Server falsch die Zeichenfolge mit dem mysql_real_escape_string () C-API-Funktion entkam Parsen.

Diese Verwundbarkeit entdeckt und von Josh Berkus und Tom Lane im Rahmen der interProjektSicherheit Zusammenarbeit des OSDB Konsortiums berichtet. Weitere Informationen zu SQL-Injection, finden Sie im folgenden Text.

Diskussion. Ein SQL-Injektionssicherheitsloch hat in Mehrbyte-Codierverarbeitung gefunden. Ein SQL-Injection-Sicherheitsloch kann eine Situation umfassen, wobei, wenn ein Benutzer gelieferten Daten in eine Datenbank eingefügt werden, kann der Benutzer SQL-Anweisungen in die Daten injizieren, die der Server ausgeführt wird. Im Hinblick auf diese Schwachstelle, als Zeichensatz-nicht bewusst Entkommen verwendet wird (beispielsweise addslashes () in PHP), ist es möglich, das austretende in einigen Multi-Byte-Zeichensätzen zu umgehen (beispielsweise SJIS, BIG5 und GBK). Als Ergebnis ist eine Funktion wie addslashes () nicht in der Lage SQL-Injection-Angriffe zu verhindern. Es ist unmöglich, dies auf der Serverseite zu beheben. Die beste Lösung ist für Anwendungen Zeichen zu verwenden Set-bewusst durch eine Funktion, wie mysql_real_escape_string () angeboten Umschreibungen.

Es wurde jedoch ein Fehler erkannt, wie der MySQL-Server die Ausgabe von mysql_real_escape_string parst (). Als Ergebnis, auch wenn das Zeichen () gesetzt bewusste Funktion mysql_real_escape_string verwendet wurde, war SQL-Injection möglich. Dieser Fehler wurde behoben.

Abhilfen. Wenn Sie nicht in der Lage sind MySQL auf eine Version zu aktualisieren, die das Update für den Fehler in mysql_real_escape_string () Analyse beinhaltet, ist aber laufen MySQL 5.0.1 oder höher, können Sie den NO_BACKSLASH_ESCAPES SQL-Modus als Abhilfe verwenden. (Dieser Modus wurde in MySQL 5.0.1 eingeführt.) NO_BACKSLASH_ESCAPES ermöglicht einen SQL-Standard-Kompatibilitätsmodus, in der umgekehrten Schrägstrich kein Sonderzeichen gilt. Das Ergebnis wird sein, dass Abfragen fehlschlagen.

Um diesen Modus für die aktuelle Verbindung zu setzen, geben Sie die folgende SQL-Anweisung:

SET sql_mode='NO_BACKSLASH_ESCAPES';

Sie können auch den Modus global für alle Clients festgelegt:

SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';

Dieser SQL-Modus kann auch automatisch aktiviert werden, wenn der Server gestartet wird, indem Sie die Befehlszeilenoption --sql-mode = NO_BACKSLASH_ESCAPES oder durch SQL-mode = NO_BACKSLASH_ESCAPES in der Server-Optionsdatei (zB my.cnf Einstellung oder my.ini, je nach System). (Bug # 8378, CVE-2006-2753)

Siehe auch Bug # 8303.

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