Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] Directory listing sicher machen - Ordner verbieten (https://www.delphipraxis.net/144460-%5Bphp%5D-directory-listing-sicher-machen-ordner-verbieten.html)

Luckie 8. Dez 2009 11:43


[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:
$forbiddenDirs = array("Source", "cgi-bin", "data", "files");
Manipuliert jetzt jemand den Parameter in der URL, soll dies abgefangen werden und derjenige soll zum Wurzelverzeichnis umgeleitet werden. Mein Versuch:
Code:
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;
         }
      }
   }
Das funktioniert komischerweise nicht. Aber die Funktion strpos habe ich doch richtig genutzt oder?

fkerber 8. Dez 2009 12:24

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: http://php.net/manual/de/function.strpos.php


Grüße, Frederic

Luckie 8. Dez 2009 12:47

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Wie soll ich denn mit === auf größer null prüfen?

fkerber 8. Dez 2009 12:50

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

DeddyH 8. Dez 2009 12:58

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.

fkerber 8. Dez 2009 13:02

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

Luckie 8. Dez 2009 13:19

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Also so:
Code:
   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;
         }
      }
   }
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.

DeddyH 8. Dez 2009 13:33

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Code:
if ($path != "")
   {         
      foreach($forbiddenDirs as $dir)
      {                 
         if (stripos($path, $dir) !== false)        
         {
            header('Location: /');
            exit;
         }
      }
   }
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.

Luckie 8. Dez 2009 13:45

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: http://www.michael-puff.de/index.php...ataverzeichnis. Da greift die Bedingung jetzt nämlich auch.

fkerber 8. Dez 2009 13:47

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

DeddyH 8. Dez 2009 13:50

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Oder reguläre Ausdrücke, aber da kann ich nicht helfen.

Luckie 8. Dez 2009 13:50

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?

DeddyH 8. Dez 2009 13:51

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Genauso dachte ich mir das.

Luckie 8. Dez 2009 13:54

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Gesagt, getan:
Code:
   // Verbotene Verzeichnisse umleiten auf Wurzelverzeichnis
   if ($path != "")
   {         
      $pathParts = explode("/", $path);
      foreach($forbiddenDirs as $dir)
      {                  
         if (in_array($dir, $pathParts))
         {
            header('Location: /');
            exit;
         }
      }
   }
Und funktioniert.

DeddyH 8. Dez 2009 13:58

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Bleibt nur noch Groß- und Kleinschreibung.

Luckie 8. Dez 2009 14:05

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:
// Wenn Pfad nicht existiert, Pfad direkt aufrufen. Führt zu 404 Seite
   if ((!$path == "") && (!file_exists('.'.$path)))
   {
      header('Location: '.$path);
      exit;
   }
Es wird ein nicht existierender Pfad aufgerufen, welcher dann mein 404 Seite aufruft.

DeddyH 8. Dez 2009 14:07

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.

Luckie 8. Dez 2009 14:08

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Das werde ich zu vermeiden suchen. ;)

DeddyH 8. Dez 2009 14:11

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Es ist ja Deine Site. Zumindest wollte ich darauf hingewiesen haben ;)

fkerber 8. Dez 2009 14:13

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

Luckie 8. Dez 2009 14:15

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

Palando 8. Dez 2009 14:50

Re: [PHP] Directory listing sicher machen - Ordner verbieten
 
Hallo!

Mit einer Regular Expression könntest du darauf beispielsweise so prüfen:

Code:
if (preg_match("/^\/?data/i", $path)) { ... }
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/".

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ß

TurboMartin 8. Dez 2009 15:18

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