Dienstag, 18. November 2008

A2: So schnell können drei Wochen vergehen

Es war einmal vor langer Zeit, da gab es eine Vorschau auf die zweite Einzelaufgabe. Einen halben Tag später war die geforderte Funktionalität auch schon implementiert.

Dann kamen noch zwei weitere Aufgaben für Interssierte dazu, wovon ich die zweite auch bald danach umgesetzt habe. Die eigentlich einfachere erste Fleißaufgabe wollte ich dann später noch machen. Aus später wurde aber zu spät, und so fiel sie ins Wasser.

Trotzdem gibt es hier noch ein paar Gedanken und Hints dazu...

Teil 1: Files

Soweit so gut, oder auch nicht - File Uploads stellen eine gefährliche Quelle für Sicherheitslücken dar. Wer ein Bild erwartet, der sollte sicherstellen, dass auch tatsächlich ein Bild hochgeladen wurde. Sonst kann es auch sein, dass eine "Bildergallerie" plötzlich als Ablage für Warez-Archive dient (auch wenn diese Zeit seit P2P mehr oder weniger vorbei ist).

Eine solche Prüfung darf nie nur auf der Dateiendung basieren, die ist auch für Laien beliebig veränderbar. Eine Überprüfung des ContentType ist da schon eine wesentlich größere Hürde für Otto Normalsurfer, für die Absicherung gegen irrtümlich falsche Datei-Uploads sollte das ausreichen. Wer genug kriminelle Energie hat, wird sich davon aber nicht abhalten lassen und seinen Browser überreden einen falschen ContentType mitzuteilen. Für Interessierte gibt es dazu eine nette Präsentation: http://www.scribd.com/doc/2971490/Secure-PHP-Upload

Teil 2: Mehrere Alben verwalten

Mein Ansatz dazu war, jedem neu angelegten Album als ID den aktuellen Timestamp zu verpassen. Jedes Album wird in ein File persistiert, dass als Namen die ID trägt, und in einem data Verzeichnis gesammelt wird. Zur Erstellung der Liste, welche Alben vorhanden sind, wird dann einfach mit der entsprechenden PHP-Funktionen (glob) durch das Verzeichnis gewandert.

1 Kommentar:

Michael Derntl hat gesagt…

Guter Hinweis das mit der Sichterheitslücke beim Upload. Eine Überprüfung auf Basis des Dateiinhalts einzubauen würde aber über das Ziel der Aufgabe hinausschiessen, obwohl es in einer "richtigen" Anwendung natürlich nötig wäre. Das gilt auch für Formulareingaben, man kann ja beliebige HTTP POST requests erzeugen und an die verarbeitende Seite schicken, wie z.b. SQL Injection.