treziman: Sicherheit: MySql-Injection und Zugriff "von aussen"

Beitrag lesen

Hallo,

auch auf die Gefahr hin, dass ich nerve....

Habe gerade bei php.net folgendes Beispiel gefunden:
"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;
?>

So, entscheidend ist die Kommentarzeile:
// Wir haben $_POST['password'] nicht geprueft, es koennte also alles darin
// stehen, was der User will.

und code:
$_POST['password'] = "' OR ''='";

Solche Eingaben erlaube ich ja schon per php-script nicht. Das eingegebene Passwort durchläuft zuerst "ctype_alnum", bei der Registrierung als auch beim Einloggen. Alles, was nicht Buchstabe und Zahl ist, führt zu einer Fehlermeldung. Und Zeichen wie Semikolon, Komma, Leerstellen usw. haben weder in einem Passwort noch in einem Nicknamen was zu suchen. Meine Meinung. Im Nicknamen ist lediglich der Unterstrich erlaubt, in Emails darüber hinaus das Minuszeichen (Bindestrich), Punkt und Klammeraffe. Ich habe noch nie eine Email gesehen die da lautet: vorname,nachname@gmx.de

Jetzt frage ich mich, wozu also zusätzlich mysql_real_escape_string() ? In einer Textarea, welche ein User selbst eingeben kann und Sonderzeichen erlaubt sind, erscheint mir das logisch, aber bietet eine solche einen Ansatz für eine injection?

Gruss
Thorsten