(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.