mysql_real_escape_string
Maskiert spezielle Zeichen innerhalb eines Strings 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 werden. Verwenden Sie stattdessen die Erweiterungen MySQLi oder PDO_MySQL.
Weitere Informationen finden Sie im Ratgeber MySQL: Auswahl einer API und den zugehörigen FAQ.
Alternativen zu dieser Funktion umfassen:
- mysqli_real_escape_string
- PDO::quote
Beschreibung
string mysql_real_escape_string
( string $unescaped_string
[, resource $link_identifier = NULL
] )
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 immer (mit wenigen Ausnahmen) verwendet werden, um Daten
abzusichern, bevor sie per Query 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. Sehen sie das Grundlagenkapitel zum Thema
Zeichensätze für
mehr Informationen.
Parameter-Liste
-
unescaped_string
-
Der zu maskierende String.
-
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 einen maskierten String oder im Fehlerfall FALSE zurück.
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());
// Anfrage erstellen
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
Beispiel #2 Ein beispielhafter SQL Injection Angriff
<?php
// Wir haben $_POST['password'] nicht geprüft, dies könnte
// ein beliebiger Wert sein den der Benutzer will
// Zum Beispiel:
$_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 jedermann 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:
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 der
Query 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.