Filtro input e amp; Bypassare
I filtri sono sempre ottimi come ulteriore livello di sicurezza, ma non dovrebbero essere la tua unica linea di difesa, perché generalmente i filtri mancano di contesto, rendendo impossibile il filtraggio sicuro al 100%.
Ad esempio, il filtro non sa nulla del sistema operativo sottostante. Accetta \
come separatore di directory? In tal caso, ..\
potrebbe funzionare. @Technidev ha menzionato un altro problema con ..\/
. A seconda del sistema operativo, anche altri attacchi potrebbero funzionare (ad esempio, potrebbe esserci un carattere che viene ignorato quando si trattano i percorsi, ma non durante il filtraggio, ho provato %00
come esempio, ma non funziona). Non ci dovrebbe essere un bypass generale che funzionerà indipendentemente dal sistema operativo.
Un filtro migliore, ma probabilmente troppo restrittivo, filtrerebbe per ..
.
Difese appropriate
La tua domanda implicita sembra essere se questo codice è sicuro, o come renderlo più sicuro.
Se non hai bisogno di un percorso, utilizza basename
, che restituirà un nome file.
Se hai bisogno di un percorso, ma dovrebbe essere all'interno della directory docs, risolvere il percorso e confrontarlo con il percorso di base .