È sufficiente rimuovere ".." dalle stringhe per evitare l'attacco di directory trasversale?

3

Diciamo che voglio creare un semplice script PHP che mi permetta di accedere ai file all'interno di una cartella:

$path = $_GET['path']; $path = str_replace('..', '', $path); $path = "./static/" . $path; readfile($path);

La riga 2 di questo esempio è sufficiente per evitare che le persone leggano i file al di fuori della cartella "statica"?

    
posta kR105 06.03.2015 - 02:11
fonte

2 risposte

7

Attualmente non riesco a pensare a una buona ragione per cui rimuovere tutte le stringhe ".." non funziona, ma il modo più appropriato sarebbe utilizzare realpath () funzione e garantisce che l'inizio della stringa corrisponda al percorso di directory completo previsto.

    
risposta data 06.03.2015 - 02:45
fonte
4

È molto facile per gli attaccanti codificare la stringa letterale .. in diversi modi. Il modo più semplice è utilizzare la codifica URL che codifica .. come %2E%2E . Questo non verrà rilevato da str_replace e continuerà a risolversi in un percorso dannoso. Vedi la OWASP Path Traversal pagina per ulteriori esempi.

realpath() è generalmente una soluzione migliore per questa situazione.

    
risposta data 13.06.2017 - 17:37
fonte

Leggi altre domande sui tag