PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] Sicherheit beim Verzeichnisse durchsuchen



Bluescreen
31.08.2009, 22:16
Ich benötige ein Skript, mit dem man einen Ordner unterhalb einer bestimmten Verzeichnisstruktur (collections) auswählt.

Dabei entsteht eine Sicherheitsfrage. Das Verzeichnis wählt man über Links aus. Dabei wird die Ordner-Adresse relativ zu "collections" per GET übergeben.

Wie kann ich aber dabei sichergehen, dass sich da niemand unterhalb von collections scrollt, zb. per
../oder
collection1/../../?

drunken monkey
31.08.2009, 23:17
Ich benötige ein Skript, mit dem man einen Ordner unterhalb einer bestimmten Verzeichnisstruktur (collections) auswählt.

Dabei entsteht eine Sicherheitsfrage. Das Verzeichnis wählt man über Links aus. Dabei wird die Ordner-Adresse relativ zu "collections" per GET übergeben.

Wie kann ich aber dabei sichergehen, dass sich da niemand unterhalb von collections scrollt, zb. per
../oder
collection1/../../?
Du könntest zum Beispiel direkt nach ".." als Verzeichnis suchen (die entsprechende RegExp sollte nicht allzu schwer sein) oder die Pfadangabe erst durch realpath() (http://at.php.net/manual/de/function.realpath.php) schicken und dann auf "/path/to/collections" als Pfadanfang prüfen.

DFYX
31.08.2009, 23:50
Ich würde ersteres empfehlen. Das hat den Vorteil, dass es auch dann funktioniert, wenn das Script mal irgendwo anders auf der Festplatte liegt. Allerdings solltest du dann auch noch überprüfen, dass der Pfad nicht mit "/" anfängt.

Mog
01.09.2009, 10:06
/Fyx: Bloedsinn. Du kannst ja auch die aktuelle Position des Scripts heraus finden. Zwei mal realpath und einen cmp. Das geht aufjedenfall schneller, als jede regexp.

DFYX
01.09.2009, 12:53
/Fyx: Bloedsinn. Du kannst ja auch die aktuelle Position des Scripts heraus finden. Zwei mal realpath und einen cmp. Das geht aufjedenfall schneller, als jede regexp.

Geht natürlich. Nur dass du für meinen Ansatz auch keine Regexps brauchst :p

dead_orc
01.09.2009, 18:54
Ich würde es mit basename() (http://de.php.net/manual/de/function.basename.php) machen, ehrlich gesagt. Dann noch einmal gucken, dass das Ergebnis nicht .. ist und fertig. Ob das performanter als die realpath()-Methode ist, weiß ich nicht, aber logisch und leicht nachvollziehbar isses allemal.

Bluescreen
01.09.2009, 20:00
Du könntest zum Beispiel direkt nach ".." als Verzeichnis suchen (die entsprechende RegExp sollte nicht allzu schwer sein) oder die Pfadangabe erst durch realpath() (http://at.php.net/manual/de/function.realpath.php) schicken und dann auf "/path/to/collections" als Pfadanfang prüfen.Danke, genau das hab ich gebraucht!

Manni
07.09.2009, 21:55
Ich würde einfach mit einem stinknormalen Suchen&Ersetzen alle "../" mit "" ersetzen (und vorher natürlich alle "\" durch "/"). Dann noch "./" vor den Pfad klatschen und doppelte Slashes entfernen und der Pfad ist sauber ;)