Dateipfad, pfadstring, filepath prüfen - Sicherheit und Gültigkeit

pUre

Mitglied
Hallo zusammen,

bin dabei gerade eine webgesteuerte Applikation zu erstellen, über die auch Daten auf Fileservern gelöscht werden können.

Über Postdaten wird ein relativer Pfad übermittelt.
Diesem wird natürlich noch der Root-Pfad vorangestellt.
Vor dem Löschen findet noch ein
PHP:
file_exists($filename)
abfrage statt, ob der Pfad tatsächlich existiert.


Nun frage ich mich, wie ein User den String manipulieren kann dass bei der Löschaktion ungewollte Daten/Ordner oder gar ab '/' sprich Root gelöscht werden kann.

Grundsätzlich bin ich schon auf folgendes gestoßen:
PHP:
while( preg_match('/(\.\.\/)+/', $filepath) )
{
    $filepath = preg_replace('/(\.\.\/)+/', '', $filepath);
}
Hiermit entferne ich schon mal rekursive alle '../' Pfadabgaben über die man auf Root gelangen könnte.


Reicht das oder kennt hier noch jemand andere Tricks, die man beachtet sollte?

Allgemeine Kommentare zu meinem Vorgehen sind natürlich auch sehr willkommen. :)
 
Zuletzt bearbeitet:
Das würde mich jetzt wundern, wenn das funktioniert, versuche es mal eher so (spart außerdem die while-Schleife ein)
PHP:
$filepath = preg_replace('/(\.\.\/)*/', '', $filepath);
Ähm ja, so funktioniert das natürlich nicht ^^. Habs wohl total falsche abgetippt.
Aber While-Schleife braucht man trotzdem, da nach nem Pregmatch von /....//....//...// =>
/../../../ als Rückstand bleibt, und das wiederum ev. auf deinen Rootpfad fürhen kann.
 
Ich habe meins erfolgreich getestet:
PHP:
$filepath = "../../../../meinPfad/meineDatei.endung";
$filepath = preg_replace('/(\.\.\/)*/', '', $filepath);
//filepath = meinPfad/meineDatei.endung
 
Ich habe meins erfolgreich getestet:
PHP:
$filepath = "../../../../meinPfad/meineDatei.endung";
$filepath = preg_replace('/(\.\.\/)*/', '', $filepath);
//filepath = meinPfad/meineDatei.endung
Ja schon aber wie gesagt, das hier...
PHP:
$filepath = "..//....//....//....//meinPfad/meineDatei.endung";
$filepath = preg_replace('/(\.\.\/)*/', '', $filepath);
//filepath = /../../../meinPfad/meineDatei.endung
...würde bei keiner rekursiven Anwendung der preg_replace keine Sicherheit bieten.

Naja, mir geht es ja noch um andere Vorschläge wie ich mich absichern kann?
Keiner noch ein Statement dazu?
 
Dann passt man den regulären Ausdruck eben ein bisschen an ;)
PHP:
$pattern = '/(\.+\/+)*/';
$filepath = "..//....//....//....//meinPfad/meineDatei.endung"; 
$filepath = preg_replace($pattern, '', $filepath);
//filepath = meinPfad/meineDatei.endung  

if( file_exists($filepath) && is_file($filepath) ){
  //Datei löschen
}

Wenn die Dateien von Nutzern hochgeladen werden, kannst du das noch mit is_uploaded_file() prüfen.
 
JNaja, mir geht es ja noch um andere Vorschläge wie ich mich absichern kann?
Keiner noch ein Statement dazu?
Winfach Prüfen ob die Kobination './' drin vorkommet und dann eine Meldung von wegen ungültigem Pfad zurückgeben. Dann soll der User selber einen Sinnvollen Pfad schreiben.
 
Zurück