MySQL-Wildcards maskieren: Eine umfassende Anleitung
Beim Umgang mit nicht vertrauenswürdigen Benutzereingaben in einer MySQL-Umgebung ist es wichtig, Sonderzeichen zu maskieren Verhindern Sie SQL-Injection-Angriffe. Zu diesem Zweck wird häufig die PHP-Funktion mysql_real_escape_string verwendet. Allerdings werden die MySQL-Platzhalter „%“ und „_“ nicht maskiert.
Um dieses Problem zu beheben, greifen einige Benutzer auf die Verwendung von addcslashes zurück, um diese Platzhalter manuell zu maskieren. Dieser Ansatz kann jedoch zu unerwarteten Ergebnissen führen, wie im folgenden Beispiel zu sehen ist:
Input: test_test " ' Database: test\_test " '
Hier wird der Unterstrich („_“) im Gegensatz zum einfachen Anführungszeichen („'“) mit einem vorangehenden Backslash maskiert. ) und doppelte Anführungszeichen („“). Dieses Verhalten kann verwirrend sein, da alle diese Zeichen mit dem Backslash-Zeichen maskiert werden.
Um dieses Phänomen zu verstehen, muss man sich eingehender mit dem Platzhalter von MySQL befassen Escape-Mechanismen. „_“ und „%“ werden im allgemeinen MySQL-Verbrauch nicht als Platzhalter behandelt und sollten bei der Erstellung normaler String-Literale nicht korrekt behandelt werden.
Allerdings wird „%_“ zu etwas Besonderem Zeichen nur im Kontext von LIKE-Übereinstimmungen. Um Zeichenfolgen für die literale Verwendung in LIKE-Anweisungen vorzubereiten, müssen Sie LIKE-Escape-Funktionen durchführen, auch wenn Sie parametrisierte Zeichen verwenden Abfragen.
LIKE-Escapeing umfasst zwei Ebenen:
Das Potenzial für Double-Backslash-Escape kann problematisch sein, insbesondere wenn Sie die String-Literale von PHP verwenden, wie in gezeigt das Beispiel.
Um diese Komplexität zu vermeiden und die Portabilität sicherzustellen, sollten Sie erwägen, das standardmäßige (falsche) LIKE zu überschreiben Escape-Verhalten und Angabe eines benutzerdefinierten Escape-Zeichens mithilfe des Konstrukts LIKE ... ESCAPE ...:
// function that performs LIKE escaping function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
Verwenden Sie es dann wie folgt:
$escapedname = mysql_real_escape_string(like($name, '=')); $query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
Befolgen Sie diese Empfehlungen, Sie können MySQL-Wildcards effektiv entgehen und die Sicherheit Ihrer Datenbankanwendungen erhöhen.
Das obige ist der detaillierte Inhalt vonWie entkomme ich MySQL-Platzhalter für sichere SQL-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!