Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mängel von mysql_real_escape_string?

Der Hauptmangel von mysql_real_escape_string , oder der mysql_-Erweiterung im Allgemeinen, ist, dass sie schwieriger korrekt anzuwenden ist als andere, modernere APIs, insbesondere vorbereitete Anweisungen. mysql_real_escape_string soll in genau einem Fall verwendet werden:dem Escapezeichen von Textinhalten, die als Wert in einer SQL-Anweisung zwischen Anführungszeichen verwendet werden. Beispiel:

$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
                     ^^^^^^

mysql_real_escape_string stellt sicher, dass der $value im obigen Kontext bringt die SQL-Syntax nicht durcheinander. Es funktioniert nicht, wie Sie hier vielleicht denken:

$sql = "... `foo` = $value ...";

oder hier:

$sql = "... `$value` ...";

oder hier:

$sql = mysql_real_escape_string("... `foo` = '$value' ...");

Wenn es auf Werte angewendet wird, die in einem anderen Kontext als einer Zeichenfolge in Anführungszeichen in einer SQL-Anweisung verwendet werden, wird es falsch angewendet und kann die resultierende Syntax durcheinander bringen oder nicht und/oder es jemandem ermöglichen, Werte zu übermitteln, die SQL-Injection-Angriffe ermöglichen können. Der Anwendungsfall von mysql_real_escape_string ist sehr eng, wird aber selten richtig verstanden.

Eine weitere Möglichkeit, sich mit mysql_real_escape_string in heißes Wasser zu bringen ist, wenn Sie die Codierung der Datenbankverbindung mit der falschen Methode festlegen. Sie sollten dies tun:

mysql_set_charset('utf8', $link);

Sie können tun Sie dies aber auch:

mysql_query("SET NAMES 'utf8'", $link);

Das Problem ist, dass letzteres die mysql_-API umgeht, die immer noch denkt, dass Sie mit latin1 mit der Datenbank sprechen (oder etwas anderes). Bei Verwendung von mysql_real_escape_string jetzt wird es die falsche Zeichencodierung und Escape-Strings anders annehmen, als die Datenbank sie später interpretieren wird. Durch Ausführen von SET NAMES Abfrage haben Sie eine Kluft zwischen der Behandlung von Zeichenfolgen durch die mysql_-Client-API und der Interpretation dieser Zeichenfolgen durch die Datenbank geschaffen. Dies kann für Injection-Angriffe in bestimmten Multibyte-String-Situationen verwendet werden.

Es gibt keine grundlegenden Injektionsschwachstellen in mysql_real_escape_string dass ich weiß, wenn es richtig angewendet wird. Das Hauptproblem besteht jedoch erneut darin, dass es erschreckend einfach ist, es falsch anzuwenden, was Schwachstellen aufdeckt.