Andreas Korthaus: Tippfehler in der URL

Beitrag lesen

Hallo!

PHPMySQLSicherheit.

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/