Function.mysql-real-escape-string

Aus PHP-Wiki

Wechseln zu: Navigation, Suche
Kfz Versicherung - Leistungsvergleich und RechtsschutzversicherungLebensversicherung . Kinderbett Elias

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

Inhaltsverzeichnis

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.
Verbindungs-Kennung
  • 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 einen maskierten String oder im Fehlerfall FALSE zurück.

Beispiele

#1 Einfaches mysql_real_escape_string()

<?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
 
if (isset($_POST['product_name'])
    && isset($_POST['product_description'])
    && isset($_POST['user_id'])) {
 
 // Verbinden mit der Datenbank
    $link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
 
    if(!is_resource($link)) {
 
        echo "Verbindung zum Server fehlgeschlagen\n";
     // ... den Fehler loggen
 
    } else {
 
     // Die Auswirkungen von magic_quotes_gpc/magic_quotes_sybase zurücksetzen,
     // sofern die Option auf ON gesetzt ist
 
        if(get_magic_quotes_gpc()) {
            $product_name        = stripslashes($_POST['product_name']);
            $product_description = stripslashes($_POST['product_description']);
        } else {
            $product_name        = $_POST['product_name'];
            $product_description = $_POST['product_description'];
        }
 
     // einen sicheren Query zusammenstellen
        $query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
                    mysql_real_escape_string($product_name, $link),
                    mysql_real_escape_string($product_description, $link),
                    $_POST['user_id']);
 
        mysql_query($query, $link);
 
        if (mysql_affected_rows($link) > 0) {
            echo "Produkt eingefuegt\n";
        }
    }
} else {
    echo "Fuellen Sie das Formular korrekt aus.\n";
}
?>
     Die Anfrage wird jetzt korrekt ausgeführt und SQL Injection Angriffe
     funktionieren nicht mehr.

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: 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.
Hinweis: Wenn die Funktion nicht verwendet wird, um die Daten zu maskieren, ist der Query 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_client_encoding() addslashes() stripslashes() Die magic_quotes_gpc-Direktive Die magic_quotes_runtime-Direktive

Persönliche Werkzeuge