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_numeric($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