Aufrechterhaltung der Verzeichnisintegrität in PHP: Verzeichnisdurchquerung verhindern und gleichzeitig Pfade zulassen
Im Bereich der Webentwicklung ist es wichtig, Benutzereingaben vor böswilligen Versuchen zu schützen von größter Bedeutung. Ein solches Problem entsteht bei der Verarbeitung von Pfaden in PHP, insbesondere wenn versucht wird, den Verzeichnisdurchlauf einzuschränken und gleichzeitig relative Pfade zu berücksichtigen.
Stellen Sie sich das folgende Szenario vor: Sie haben den Basispfad „/whatever/foo/“ und möchten ihn zulassen Benutzer können mit $_GET['path'] relative Pfade angeben. Sie müssen jedoch verhindern, dass sie Schwachstellen ausnutzen, wie etwa den Zugriff auf Dateien außerhalb des vorgesehenen Verzeichnisses.
Herkömmliche Methoden wie die Suche nach Sequenzen wie „…“ und „..“ im vom Benutzer angegebenen Pfad reichen nicht aus. da sie umgangen werden können. Glücklicherweise gibt es eine robustere Lösung.
Nutzung realer Pfade mit realpath()
Um das Durchlaufen von Verzeichnissen wirksam zu verhindern und gleichzeitig relative Pfade zuzulassen, sollten Sie die Verwendung von realpath() in Betracht ziehen. Diese Funktion löst einen gegebenen Pfad zu seinem absoluten, physischen Standort auf und berücksichtigt dabei Symlinks, „.“ und „..“-Referenzen und andere virtuelle Verzeichnisse.
Der folgende Codeausschnitt veranschaulicht diesen Ansatz:
$basepath = '/foo/bar/baz/'; $realBase = realpath($basepath); $userpath = $basepath . $_GET['path']; $realUserPath = realpath($userpath); if ($realUserPath === false || strpos($realUserPath, $realBase) !== 0) { //Directory Traversal! } else { //Good path! }
Zuerst wird $realBase durch Anwenden von realpath() auf den Basispfad erhalten , um sicherzustellen, dass es seinen physischen Standort genau wiedergibt. Als nächstes wird $realUserPath durch Verketten des Basispfads und des vom Benutzer bereitgestellten Pfads bestimmt, gefolgt von der Auflösung seines tatsächlichen physischen Pfads mit realpath().
Entscheidend ist, dass wir $realUserPath mit $realBase vergleichen. Wenn $realUserPath dem Wert „false“ entspricht (was auf einen ungültigen oder nicht vorhandenen Pfad hinweist) oder wenn es nicht mit „$realBase“ beginnt, wird ein Verzeichnisdurchlaufversuch erkannt. Wenn umgekehrt $realUserPath mit $realBase initiiert, bedeutet dies einen zulässigen Pfad.
Durch die Verwendung von realpath() erhalten Sie eine zuverlässige Methode, um das Durchlaufen von Verzeichnissen zu verhindern und gleichzeitig relative Pfade in PHP zuzulassen, wodurch Ihre Anwendung effektiv vor bösartigen Angriffen geschützt wird Eingabe und Wahrung der Integrität Ihrer Verzeichnisstruktur.
Das obige ist der detaillierte Inhalt vonWie kann PHP das Durchlaufen von Verzeichnissen verhindern und gleichzeitig relative Pfade zulassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!