Moin,
davor fürchte ich mich am meisten da es ja in PHP leider nichts gibt was wirklich sicher ist. Wer mir nicht glaubt sollte mal das hier lesen http://www.securereality.com.au/studyinscarlet.txt da kommt einem das pure fürchten.
Das würde ich so nicht sagen. Es ist zwar schon ein bisschen her dass ich den verlinkten Text gelesen haben, aber wenn ich mich recht entsinne war da nichts bei was man nicht durch ein paar einfache Regeln verhindern hätte können:
- Bei allen Datenbankabfragen die Parameter in Anführungszeichen einschließen und dafür sorgen dass Anführungszeichen innerhalb der Parameter escaped sind (zum Beispiel dadurch dass magic_quotes_gpc eingeschaltet wird) oder reine Zahlenparameter nach (int) casten
- Alle Variablen die lokal verwendet werden und keine userbestimmten Daten enthalten sollen, korrekt initialisieren. Das heisst der erste Zugriff auf eine Variable sollte ein $bla = ... oder ein unset($bla); sein. (Um solche Fehler zu finden, hilft es den Interpreter auch Fehlermeldungen auf Notice-Level ausgeben zu lassen)
- Aller userbestimmbare Text wird bei der Ausgabe entweder mit stripslashes() (nicht so gut) oder htmlentities() bearbeitet. Wenn der User wirklich HTML-Code ausgeben können soll, müssen entsprechend andere Vorkehrungen getroffen werden, das ist zugegebenermaßen nicht mehr trivial.
- Wenn Shellkommandos aufgerufen werden sollen, müssen die Parameter mit escapeshellarg() escaped werden
- Wenn Fileuploads im Spiel sind, muss is_uploaded_file() verwendet werden.
- Es versteht sich von selbst, dass fopen($userbestimmbarevariable) in keiner Form aktzeptabel ist. Besser ist da if($bla=="1") fopen("erstedatei"); else if($bla=="2") fopen("zweitedatei") etc. oder wenn schon Userbestimmbar dann bitteschön fopen("einsicheresverzeichnis".basename($bla))
Das sollte im Prinzip den größten Teil der potentiellen Sicherheitsprobleme abdecken und ist, wenn man es sich erstmal angewöhnt hat, gar nicht so schwer durchzuziehen.
--
Henryk Plötz
Grüße von der Ostsee