(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 bietet der Ratgeber MySQL: Auswahl einer API. Alternativen zu dieser Funktion umfassen:
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.
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.
unescaped_string
Die zu maskierende Zeichenkette.
link_identifier
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.
Gibt eine maskierte Zeichenkette zurück oder im Fehlerfall false
.
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.
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.
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:
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.