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 .