![]() |
[PHP] Directory listing sicher machen - Ordner verbieten
Ist wohl eigentlich eher ein reines PHP Problem aber trotzdem habe ich das Problem im obigen Zusammenhang.
Ich habe ein Array mit Verzeichnissen, die nicht aufgelistet werden dürfen:
Code:
Manipuliert jetzt jemand den Parameter in der URL, soll dies abgefangen werden und derjenige soll zum Wurzelverzeichnis umgeleitet werden. Mein Versuch:
$forbiddenDirs = array("Source", "cgi-bin", "data", "files");
Code:
Das funktioniert komischerweise nicht. Aber die Funktion strpos habe ich doch richtig genutzt oder?
if ($path != "")
{ foreach($forbiddenDirs as $dir) { // data /data data/ /data/ if ((strpos($path, $dir) > 0) || (strpos($path, '/'.$dir) > 0) || (strpos($path, $dir.'/') > 0) || (strpos($path, '/'.$dir.'/') > 0)) { header('Location: /'); exit; } } } |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Hi!
Auch wenn das dein Problem wahrscheinlich nicht löst, solltest du vllt. besser nicht mit >0 testen sondern eher mit ===. Siehe dazu auch die Warnung hier: ![]() Grüße, Frederic |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Wie soll ich denn mit === auf größer null prüfen?
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Hi!
Gar nicht, aber warum willst du auch auf größer 0 prüfen? Ich dachte, du nutzt den Vergleich mit 0 um herausfinden zu können, ob der Wert gefunden wurde? Und so wie ich die Warnung verstehe, soll man das nicht unbedingt tun. Sondern soll eher testen, ob der Wert als FALSE angesehen werden kann (für den Fall, dass nix gefunden wurde). Grüße, Frederic |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Der Ansatz ist IMO sowieso noch nicht ausgereift. Wenn beispielsweise die 4. Bedingung zutrifft ('/'.$dir.'/'), trifft auch automatisch die 2. ('/'.$dir) und/oder 3. ($dir.'/') zu, somit ist die 4. Bedingung überflüssig. Außerdem würden auch Verzeichnisse vom Listing ausgenommen, die den Namen der auszuschließenden enthalten (OK, besser als andersrum, aber trotzdem unschön). Meine PHP-Versuche sind zwar eine Zeit her, aber evtl. sollte man den übergebenen Pfad mit explode() am Slash aufsplitten und mit den Elementen vergleichen (case-insensitive), das würde zumindest einige der genannten Punkte beheben.
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Hi!
Wäre es nicht sowieso sinnvoller das Directory-Listing in den Ordnern mit .htaccess zu verbieten? Wenn ich das aus dem anderen Thread richtig in Erinnerung habe, setzt deine PHP-Lösung doch auch auf .htaccess auf, oder? Grüße, Frederic |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Also so:
Code:
Funktioniert es auch nicht richtig, obwohl in $path die Zeichenketten enthalten sind. Es funktioniert nur bei "/data" und "/data/". Bei "data/" und bei "data" greift die Abfrage irgendwie nicht.
if ($path != "")
{ foreach($forbiddenDirs as $dir) { // data /data data/ if ((!strpos($path, $dir) === false) || (!strpos($path, '/'.$dir) === false) || (!strpos($path, $dir.'/') === false))) { header('Location: /'); exit; } } } |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Code:
Wenn "/data" enthalten ist, muss logischerweise auch "data" enthalten sein. Außerdem solltest Du wenn schon case-insensitive prüfen. Ist allerdings ungetestet, ich hab hier kein PHP.
if ($path != "")
{ foreach($forbiddenDirs as $dir) { if (stripos($path, $dir) !== false) { header('Location: /'); exit; } } } |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Ja das stimmt und so funktioniert es auch. Nur wollte ich verhindern, dass auch so was erkannt wird:
![]() |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Hi!
Dann darfst du nicht mit strpos / stripos arbeiten, sondern musst eben wirkliche ==-Vergleiche nutzen (wohl wie schon angedeutet mit explode). Grüße, Frederic |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Oder reguläre Ausdrücke, aber da kann ich nicht helfen.
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Also mit Explode den Pfad zerlegen und dann gucken, ob zum Beispiel "data" in dem resultierenden Array vorkommt?
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Genauso dachte ich mir das.
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Gesagt, getan:
Code:
Und funktioniert.
// Verbotene Verzeichnisse umleiten auf Wurzelverzeichnis
if ($path != "") { $pathParts = explode("/", $path); foreach($forbiddenDirs as $dir) { if (in_array($dir, $pathParts)) { header('Location: /'); exit; } } } |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Bleibt nur noch Groß- und Kleinschreibung.
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Das ist kein Problem, da Pfade unter Linux casesensitiv sind. Und das Verzeichnis "Data" gibt es nicht, da rennt er dann in die nächste Überprüfung:
Code:
Es wird ein nicht existierender Pfad aufgerufen, welcher dann mein 404 Seite aufruft.
// Wenn Pfad nicht existiert, Pfad direkt aufrufen. Führt zu 404 Seite
if ((!$path == "") && (!file_exists('.'.$path))) { header('Location: '.$path); exit; } |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Und wenn Du zu einem Provider wechselst, der einen Windows-Server betreibt, hast Du eine Sicherheitslücke.
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Das werde ich zu vermeiden suchen. ;)
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Es ist ja Deine Site. Zumindest wollte ich darauf hingewiesen haben ;)
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Hi!
Ich würde noch das zu bedenken geben: zu schützendes Verzeichnis: /data/ nicht zu schützendes Verzeichnis: /public/data/ Wenn ich nicht irre, wird der Aufruf trotzdem verhindert. Grüße, Frederic |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Jupp, das ist richtig. Aber darüber mache ich mir Gedanken, wenn es soweit ist und der Fall mal eintreten sollte. ;)
|
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Hallo!
Mit einer Regular Expression könntest du darauf beispielsweise so prüfen:
Code:
Die regex sucht case-insensitiv nach "/data" oder "data" am Anfang des Strings, erkennt also folgende Pfade: "/data/bla", "data/bla", "/DATA", "data/" usw, stört sich aber nicht an "/public/data" oder "/mydata/".
if (preg_match("/^\/?data/i", $path)) { ... }
Was jetzt noch als verboten erkannt wird ist sowas wie "/datasalat/", mit ein bisschen Spielerei kriegt man das aber auch noch hin. Eine andere potentielle Sicherheitslücke: "/public/../data" wird auch nicht erkannt. Gruß |
Re: [PHP] Directory listing sicher machen - Ordner verbieten
Vielleicht hilft ja die realpath-Funktion und $_SERVER['document_root'] von PHP weiter
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz