Filtrado de entrada & Eludir
Los filtros siempre son excelentes como una capa adicional de seguridad, pero no deberían ser su única línea de defensa, ya que generalmente a los filtros les falta contexto, lo que hace imposible un filtrado 100% seguro.
Por ejemplo, su filtro no sabe nada sobre el sistema operativo subyacente. ¿Acepta \
como separador de directorio? Si es así, ..\
puede funcionar. @Technidev mencionó otro problema con ..\/
. Dependiendo del sistema operativo, otros ataques pueden funcionar también (por ejemplo, puede haber un carácter que se ignora al tratar las rutas, pero no al filtrar; probé %00
como ejemplo, pero no funciona). Sin embargo, no debería haber un desvío general que funcione independientemente del sistema operativo.
Un filtro mejor, pero posiblemente demasiado restrictivo, filtraría por ..
.
Defensas adecuadas
Su pregunta implícita parece ser si este código es seguro o cómo hacerlo más seguro.
Si no necesita una ruta, solo use basename
, que devolverá un nombre de archivo.
Si necesita una ruta, pero debería estar dentro del directorio docs, resuelva la ruta y compárela con la ruta base .