mysql_real_escape_string
(PHP 4 >= 4.3.0, PHP 5)
mysql_real_escape_string — Maskiert spezielle Zeichen innerhalb einer Zeichenkette für die Verwendung in einer SQL-Anweisung
Diese Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 entfernt. Verwenden Sie stattdessen die Erweiterungen MySQLi oder PDO_MySQL. Weitere Informationen finden Sie im Ratgeber MySQL: Auswahl einer API. Alternativen zu dieser Funktion umfassen:
Beschreibung
$unescaped_string
, resource $link_identifier
= NULL): string
Maskiert spezielle Zeichen in unescaped_string
unter
Berücksichtigung des aktuellen Zeichensatzes der Verbindung, so dass das
Ergebnis ohne Probleme in mysql_query() verwendet werden
kann. Wenn Sie Binärdaten einfügen wollen, müssen Sie die Funktion auf
jeden Fall verwenden.
mysql_real_escape_string() ruft die Funktion
mysql_real_escape_string der MySQL-Bibliothek auf, die folgende Zeichen mit
einem Backslash ('\') versieht: \x00
,
\n
, \r
, \
,
'
, "
und \x1a
.
Die Funktion muss (mit wenigen Ausnahmen) immer verwendet werden, um Daten abzusichern, bevor sie per Abrage an MySQL übermittelt werden.
Sicherheit: Der Standardzeichensatz
Der Zeichensatz muss entweder auf Ebene des Servers oder mittels der API-Funktion mysql_set_charset() gesetzt werden, damit dieser mysql_real_escape_string() beeinflusst. Siehe das Grundlagenkapitel zum Thema Zeichensätze für mehr Informationen.
Parameter-Liste
-
unescaped_string
-
Die zu maskierende Zeichenkette.
-
Verbindungs-Kennung
-
Die MySQL-Verbindung. Wird die Verbindungskennung nicht angegeben, wird die letzte durch mysql_connect() geöffnete Verbindung angenommen. Falls keine solche Verbindung gefunden wird, wird versucht, eine Verbindung aufzubauen, wie es beim Aufruf von mysql_connect() ohne Angabe von Argumenten der Fall wäre. Falls zufällig keine Verbindung gefunden oder aufgebaut werden kann, wird eine Warnung der Stufe
E_WARNING
erzeugt.
Rückgabewerte
Gibt eine maskierte Zeichenkette zurück oder im Fehlerfall false
.
Fehler/Exceptions
Wird diese Funktion ohne MySQL-Verbindung ausgeführt, werden ebenfalls
PHP-Fehler der Stufe E_WARNUNG
ausgelöst. Diese
Funktion sollte nur mit einer gültigen MySQL-Verbindung verwendet werden.
Beispiele
Beispiel #1 Einfaches mysql_real_escape_string()-Beispiel
<?php
// Verbindung herstellen
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Abfrage erstellen
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
Beispiel #2 mysql_real_escape_string() benötigt eine Verbindung
Diese Beispiel verdeutlicht, was geschieht, wenn beim Aufruf dieser Funktion keine MySQL-Verbindung vorhanden ist.
<?php
// Wir sind nicht mit MySQL verbunden
$lastname = "O'Reilly";
$_lastname = mysql_real_escape_string($lastname);
$query = "SELECT * FROM actors WHERE last_name = '$_lastname'";
var_dump($_lastname);
var_dump($query);
?>
Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:
Warning: mysql_real_escape_string(): No such file or directory in /this/test/script.php on line 5 Warning: mysql_real_escape_string(): A link to the server could not be established in /this/test/script.php on line 5 bool(false) string(41) "SELECT * FROM actors WHERE last_name = ''"
Beispiel #3 Ein beispielhafter SQL-Injection-Angriff
<?php
// Wir haben $_POST['password'] nicht überprüft, es könnte
// jeder beliebiger Wert sein, den der Benutzer will!
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Datenbankabfrage zur Ueberpruefung der Logindaten
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);
// Das bedeutet, der an MySQL gesendete Query wuerde sein:
echo $query;
?>
Die Abfrage, die an MySQL übermittelt wird:
SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''
Dies würde jedem erlauben, sich ohne valides Passwort einzuloggen.
Anmerkungen
Hinweis:
Sie müssen eine Verbindung zu MySQL geöffnet haben, bevor Sie mysql_real_escape_string() verwenden, ansonsten erhalten Sie einen Fehler vom Typ
E_WARNING
und der Rückgabewert wird zufalse
. Istlink_identifier
nicht angegeben, wird die letzte MySQL-Verbindung verwendet.
Hinweis:
Ist magic_quotes_gpc aktiviert, wenden Sie zuerst stripslashes() auf die Daten an. Das Bearbeiten bereits in irgend einer Form maskierter Daten durch mysql_real_escape_string führt ansonsten dazu, dass bereits Maskiertes doppelt maskiert wird.
Hinweis:
Wenn die Funktion nicht verwendet wird, um die Daten zu maskieren, ist die Abfrage anfällig für SQL-Injection-Angriffe.
Hinweis: mysql_real_escape_string() maskiert weder
%
noch_
. Diese Zeichen werden in MySQL als Platzhalter interpretiert, wenn sie mitLIKE
,GRANT
oderREVOKE
kombiniert werden.
Siehe auch
- mysql_set_charset() - Setzt den Verbindungszeichensatz
- mysql_client_encoding() - Liefert den Namen des Zeichensatzes
- addslashes() - Stellt bestimmten Zeichen eines Strings ein "\" voran
- stripslashes() - Entfernt Maskierungszeichen aus einem String
- Die magic_quotes_gpc-Direktive
- Die magic_quotes_runtime-Direktive