Maskiert spezielle Zeichen innerhalb einer Zeichenkette für die Verwendung in einer SQL-Anweisung

# 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:

- mysqli_real_escape_string()
- PDO::quote()

### Beschreibung

function mysql_real_escape_string(string `$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.

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.

### Siehe auch

- mysql_set_charset() - Setzt den Verbindungszeichensatz
- mysql_client_encoding() - Liefert den Namen des Zeichensatzes

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open