Ich möchte einen Pfad von einer externen Ressource normalisieren, um Directory Traversal-Angriffe zu verhindern. Ich kenne die Funktion realpath () , aber diese Funktion gibt leider nur den Pfad der vorhandenen Verzeichnisse zurück. Wenn also das Verzeichnis (noch) nicht existiert, schneidet die Funktion realpath () den gesamten Teil des Pfades ab, der nicht existiert.
Also meine Frage ist: Kennen Sie eine PHP-Funktion, die nur den Pfad normalisiert?
PS: Ich möchte auch nicht alle möglichen Verzeichnisse im Voraus erstellen; -)
Dank an Benubird / Cragmonkey hat mich korrigiert, dass meine vorherige Antwort in einigen Situationen nicht funktioniert hat. so mache ich eine neue, für den ursprünglichen Zweck: Führe gute, weniger Zeilen und mit reinem regulärem Ausdruck aus:
%Vor%Diesmal habe ich mit viel strengerem Testfall wie unten getestet.
Die richtige Antwort wäre / test /.
Nicht für den Wettbewerb gedacht, aber Leistungstest ist ein Muss:
Testfall: for-Schleife 100k mal, auf einem Windows 7, i5-3470 Quad Core, 3,20 GHz.
meins: 1,746 sec.
Tom Imrei: 4.548 Sek.
Benubird: 3.593 Sekunden.
Ursa: 4,334 Sekunden.
Es bedeutet nicht, dass meine Version immer besser ist. In einigen Situationen führen sie simular aus.
Ich denke, die Lösung von Tamas wird funktionieren, aber es ist auch möglich, dies mit Regex zu tun, das weniger effizient ist, aber besser aussieht. Vals Lösung ist falsch; aber das funktioniert.
%Vor% Ja, es behandelt nicht alle möglichen verschiedenen Kodierungen von. \ usw., die es geben kann, aber das ist nicht der Zweck davon; Eine Funktion sollte nur eines tun. Wenn Sie also %2e%2e%2f
in ../
konvertieren möchten, führen Sie sie zuerst durch eine separate Funktion.
Realpath löst auch symbolische Links auf, was natürlich unmöglich ist, wenn der Pfad nicht existiert; aber wir können die zusätzlichen Zeichen '/./', '/../' und '/' entfernen.
Meine 2 Cent. Die Regexp wird nur für leere Pfadblöcke verwendet:
%Vor%Tags und Links php path normalize directory-traversal