Alternativ zu mysql_real_escape_string ohne DB Verbindungs
-
18-09-2019 - |
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
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.