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
Warnung
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:
Beschreibung
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.
Achtung
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.
-
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.
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 zu false
. Ist link_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 mit LIKE
,
GRANT
oder REVOKE
kombiniert werden.