Hallo!
Netter Text! Ich hätte da aber noch zwei Anmerkungen:
Zum Thema "SQL-Injektion":
Erstmal halte ich nicht viel von magic_quotes_gpc = On, weil addaslashes() nicht mit der Quote-Funktionen der Datenbank übereinstimmt, und damit nutzlos ist. Man sollte im Fall von MySQL z.B. mysql_real_escape_string() verwenden, oder die mysqli-Extension mit BindParam.
Außerdem hilft das beste Escaping nichts gegen sowas:
$sql = "
UPDATE users
SET (passwd=".mysql_real_escape_string($_GET['pass']).")
WHERE (name=".mysql_real_escape_string($_GET['user']).")
";
Wenn man jetzt folgendes aufruft:
file.php?pass=geheim&user=ich OR 1=1
werden die Passwörter für _alle_ User verändert.
Man muss also die Parameter _immer_ in '' einschließen, also so:
$sql = "
UPDATE users
SET (passwd='".mysql_real_escape_string($_GET['pass'])."')
WHERE (name='".mysql_real_escape_string($_GET['user'])."')
";
Dein Beispiel hat das auch so gemacht, aber ich finde es wichtig das auch rauszustellen, weil viele das eben nicht so machen.
Zum Thema "Dateihandling":
$filename = sprintf('%sdir/%s.ext', $_GET['category'], $_GET['name']);
Wenn ich das wie folgt aufrufe:
file.php?category=sub&name=../../../etc/hosts
ist es ausgehebelt. Du gehst zwar auf ../ ein, aber es gibt keine Alternative wenn Du die GET-Werte selbst verwenden willst. Ich würde es wenn nur irgendwie möglich vermeiden Daten vom User direkt an solche Funktionen zu übergeben (z.B. durch eine "whitelist"). Wenn Du es denn doch direkt verwenden willst, würde ich basename($_GET['name']) ... verwenden (für _jeden_ Parameter!).
Allgemein kann ich noch folgende Links zum Thema empfehlen:
http://de.php.net/manual/de/security.php
http://de.php.net/security-note.php
http://phpsec.org/projects/
http://talks.php.net/index.php/Security
http://www.owasp.org/
http://www.sklar.com/page/article/owasp-top-ten
Grüße
Andreas
SELFHTML Feature Artikel: http://aktuell.de.selfhtml.org/artikel/