Heim >Datenbank >MySQL-Tutorial >Wie kann ich MySQL-Sonderzeichen, einschließlich Platzhalter, beim Einfügen in die Datenbank sicher maskieren?

Wie kann ich MySQL-Sonderzeichen, einschließlich Platzhalter, beim Einfügen in die Datenbank sicher maskieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-07 07:11:11664Durchsuche

How Can I Safely Escape MySQL Special Characters, Including Wildcards, for Database Insertion?

MySQL-Sonderzeichen für das Einfügen in die Datenbank maskieren

Beim Einfügen von Benutzereingaben in eine MySQL-Datenbank ist es wichtig, mögliche Schwachstellen durch ordnungsgemäßes Escapezeichen für Sonderzeichen zu verhindern Charaktere. Die PHP-Funktion mysql_real_escape_string erledigt diese Aufgabe effektiv, entgeht jedoch nicht den MySQL-Platzhaltern % und _.

Um dieses Problem zu beheben, verwenden viele Entwickler die Funktion addcslashes in Verbindung mit mysql_real_escape_string, um auch diese Platzhalter zu maskieren. Dieser Ansatz kann jedoch zu unerwarteten Ergebnissen führen.

Wildcard-Escaping in MySQL verstehen

Entgegen der landläufigen Meinung gelten _ und % in MySQL nicht als Platzhalter für allgemeine Zeichenfolgen Literale. Sie sollten nur maskiert werden, wenn sie in LIKE-Anweisungen zum Mustervergleich verwendet werden.

Die Hierarchie des Escapens

Das Escapen von Sonderzeichen im Kontext von LIKE-Anweisungen umfasst zwei Ebenen:

  1. LIKE-Escape: Innerhalb von LIKE-Anweisungen müssen _ und % vorhanden sein entkommen, zusammen mit dem Escape-Zeichen. Das Escape-Zeichen selbst muss ebenfalls maskiert werden.
  2. String-Literal-Escape: Nach dem LIKE-Escape müssen Zeichenfolgen basierend auf den Anforderungen der spezifischen Datenbank einem regulären String-Literal-Escapezeichen unterzogen werden. Für MySQL geschieht dies mit mysql_real_escape_string.

Die Verwirrung mit doppelten Backslashes

MySQL verwendet das Backslash-Zeichen als Escape-Zeichen sowohl für LIKE-Escapezeichen als auch für Strings buchstäbliches Entkommen. Dies kann zu Verwirrung führen, wie zum Beispiel beim Einfügen einer Zeichenfolge mit %. Doppelte Backslashes müssen verwendet werden, um es für LIKE-Zwecke zu maskieren, und dann muss die Zeichenfolge als Ganzes erneut mit Escapezeichen versehen werden, um String-Literale einzufügen.

ANSI SQL und Portable LIKE Escaping

ANSI SQL definiert, dass Backslashes innerhalb von String-Literalen literale Backslashes darstellen und einfache Anführungszeichen mit „“ maskiert werden. Allerdings weicht MySQL von diesem Standard ab. Um die Portabilität sicherzustellen, wird empfohlen, das Standardverhalten von MySQL zu überschreiben und ein benutzerdefiniertes Escape-Zeichen mithilfe des Konstrukts LIKE ... ESCAPE ... anzugeben. Zum Beispiel:

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

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

Das obige ist der detaillierte Inhalt vonWie kann ich MySQL-Sonderzeichen, einschließlich Platzhalter, beim Einfügen in die Datenbank sicher maskieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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