Moin!
Wäre diesem Angriffsvector denn dann durch
$forbidden=array('//', '../', '/..', '/.ht');
zu begegnen?
Ich würde da kein Geld drauf verwetten. Die Idee krankt grundsätzlich an der Tatsache, dass reale Verzeichnispfade "nur" mit Stringoperationen bearbeitet werden.
Relative Pfade sind immer problematisch. Man weiß nie so genau, auf welcher Basis die aufsetzen - einmal in PHP ein passendes chdir()
aufgerufen, und schon sind die ganzen Pfade relativ zu diesem gesetzten Verzeichnis, und nicht mehr zum Skript selbst.
Die korrekte Vorgehensweise wäre, mit realpath()
das Dateisystem zu befragen, auf welchem absoluten Pfad man mit der relativen (oder auch absoluten) Angabe man landet, und danach zu prüfen, ob dieses Ergebnis den Präfix des auszuliefernden Verzeichnisses hat (beispielsweise innerhalb von DOCUMENT_ROOT liegt) - andernfalls nichts ausliefern.
Grüße Sven