Wie entkomme ich MySQL-Platzhalter für sichere SQL-Abfragen?

Barbara Streisand
Freigeben: 2024-11-09 10:03:02
Original
181 Leute haben es durchsucht

How to Escape MySQL Wildcards for Secure SQL Queries?

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 " '
Nach dem Login kopieren

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:

  1. LIKE-Escapeing: _ und % sind speziell und müssen maskiert werden. Das Escape-Zeichen () muss ebenfalls maskiert werden entkommen.
  2. String-Literal-Escape: Führen Sie nach dem LIKE-Escape eine einfache Zeichenfolge aus Literal-Escape mit mysql_real_escape_string (für MySQL) oder der entsprechenden Funktion für andere Datenbanken.

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);
}
Nach dem Login kopieren

Verwenden Sie es dann wie folgt:

$escapedname = mysql_real_escape_string(like($name, '='));
$query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage