PHP: normalize Pfad von nicht existierenden Verzeichnissen, um Directory-Traversals zu verhindern?

9

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; -)

    
JepZ 08.04.2012, 16:44
quelle

5 Antworten

5

Dafür gibt es keine eingebaute PHP-Funktion. Verwenden Sie stattdessen Folgendes:

%Vor%     
Tom Imrei 09.04.2012 01:24
quelle
2

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:

  

Diesmal habe ich mit viel strengerem Testfall wie unten getestet.

%Vor%

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.

    
Val 16.01.2013 09:24
quelle
2

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.

    
Benubird 20.08.2013 14:44
quelle
1

Strenge, aber sichere Implementierung. Wenn Sie nur ASCII für Dateinamen verwenden, wäre es geeignet:

%Vor%     
ursa 15.11.2014 00:59
quelle
0

Meine 2 Cent. Die Regexp wird nur für leere Pfadblöcke verwendet:

%Vor%     
mirko temperini 07.11.2016 14:57
quelle