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.

Hosting by: Hurra Communications GmbH
Generated: 2007-01-26 17:57:04