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 Benutzung in einer SQL-Anweisung

## Beschreibung

string mysql_real_escape_string ( string unescaped_string [, resource Ergebnis-Kennung] )

unescaped_string

  Zeichenkette, die maskiert werden soll

Ergebnis-Kennung (optional)

  Eine MySQL Verbindungsressource

Diese Funktion maskiert spezielle Zeichen in unescaped_string, unter Berücksichtigung des aktuellen Zeichensatzes der Verbindung, zur sicheren Benutzung in mysql_query(). Falls Sie vorhaben, binäre Daten einzufügen, müssen Sie diese Funktion benutzen.

mysql_real_escape_string() ruft die MySQL Bibliotheksfunktion mysql_escape_string auf, diese stellt den folgenden Zeichen einen Backslash voran: NULL, \x00, \n, \r, \, ', " und \x1a.

Beispiel 1. Einfaches mysql_real_escape_string() Beispiel
`<?php // verbinden $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') OR die(mysql_error()); // Anfrage $query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'", mysql_real_escape_string($user), mysql_real_escape_string($password)); ?>`

Bevor Sie eine Anfrage an MySQL absetzten, müssen Sie immer diese Funktion verwenden (mit einigen Ausnahmen), um Ihre Daten sicher zu machen. Falls Sie magic_quotes_gpc aktiviert haben und mit Daten aus Benutzereingaben arbeiten, müssen Sie vorher Ihre Daten mit stripslashes() behandeln. Falls Ihre Daten aus anderen Quellen stammen und Sie magic_quotes_runtime aktiviert haben, müssen Sie ebenfalls Ihre Daten mit stripslashes() behandeln. Falls Sie diesen Rat nicht beherzigen, ist Ihre Anwendung anfällig für SQL Code-Einschleusung. Hier ein Beispiel:

Beispiel 2. Ein Beispiel für SQL Code-Einschleusung
`<?php // Anfrage an die Datenbank zum prüfen, ob übereinstimmende user vorhanden sind $query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'"; mysql_query($query); // Wir haben $_POST['password'] nicht überprüft, könnte alles mögliche enthalten // was ein User will. Zum Beispiel: $_POST['username'] = 'aidan'; $_POST['password'] = "' OR 1=1"; // Die gesendete Anfrage an MySQL würde sein: echo $query; ?>`
Gesendete Anfrage an MySQL:
    SELECT * FROM users WHERE name='aidan' AND password='' OR 1=1
Diesers Vorgehen würde es jeder beliebigen Person erlauben, sich ohne gültiges Passwort einzuloggen! Bei der Verwendung von mysql_real_escape_string() für jede Variable wird dies verhindert.
`<?php /** * Variable für sichere Verwendung quotieren */ function quote_smart($value) { // stripslashes, falls nötig if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // quotieren, falls kein integer if (!is_int($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } // verbinden $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') OR die(mysql_error()); // sichere Anfrage formulieren $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 nun korrekt ausgeführt und Code-Einschleusung ist nicht mehr möglich.

> Anmerkung: Die Zeichen % und _ werden von mysql_real_escape_string() nicht maskiert. Diese Zeichen sind für MySQL Platzhalter, wenn sie zusammen mit LIKE, GRANT, oder REVOKE benutzt werden.

Siehe auch: mysql_client_encoding(), addslashes(), stripslashes(), die magic_quotes_gpc und die magic_quotes_runtime Einstellung.

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