PHP Handbuch
Zurück |  | Weiter

# mysql_real_escape_string

(PHP 4 >= 4.3.0, PHP 5)

mysql_real_escape_string -- Maskiert spezielle Zeichen innerhalb eines Strings für die Verwendung in einer SQL-Anweisung

## Beschreibung

string mysql_real_escape_string ( string unescaped_string [, resource link_identifier] )

Maskiert spezielle Zeichen im 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 immer (mit wenigen Ausnahmen) verwendet werden, um Daten abzusichern, bevor sie per Query an MySQL übermittelt werden.

## Parameter Liste

unescaped_string

  Der zu maskierende String.

link_identifier

  The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an `E_WARNING` level warning is generated.

## 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
// Datenbankabfrage zur Ueberpruefung der Logindaten
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);
// Wir haben $_POST['password'] nicht geprueft, es koennte also alles darin
// stehen, was der User will. Zum Beispiel:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// 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.

Beispiel 3. Optimale Vorgehensweise zur Querybehandlung

Die Verwendung von mysql_real_escape_string() bei jeder Variablen beugt SQL Injection Angriffen vor. Das Beispiel demonstriert ein optimales Verfahren für Datenbankanfragen, das unabhängig vom für Magic Quotes gesetzten Wert funktioniert.

`<?php
// Variablen absichern
function quote_smart($value)
{
// Ueberfluessige Maskierungen entfernen
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// In Anfuehrungszeichen setzen, sofern keine Zahl
// oder ein numerischer String vorliegt
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
// Verbinden mit der Datenbank
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Erstellen eines sicheren Query
$query = sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
quote_smart($_POST['username']),
quote_smart($_POST['password']));
mysql_query($query);
?>`

Die Anfrage wird jetzt korrekt ausgeführt und SQL Injection Angriffe funktionieren nicht mehr.

## Anmerkungen

> Anmerkung: 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.

> Anmerkung: 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.

> Anmerkung: Wenn die Funktion nicht verwendet wird, um die Daten zu maskieren, ist der Query anfällig für SQL Injection Angriffe.

> Anmerkung: 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_client_encoding()
addslashes()
stripslashes()
Die magic_quotes_gpc Directive
Die magic_quotes_runtime Directive

Zurück | Zum Anfang | Weiter
mysql_query | Nach oben | mysql_result