Tengo un formulario que envía una cadena a mi aplicación Flask cuando se publica el formulario. La cadena es una ruta de archivo, por lo que me gustaría asegurarme de que no contenga nada desagradable, como ../../../etc/passwd
. Werkzeug, que usa Flask, tiene una función útil llamada secure_filename
que quita cosas desagradables de los nombres de archivos. Desafortunadamente, cuando se alimenta con una ruta completa como templates/example.html
, convierte /
en _
, por lo que terminamos en templates_example.html
.¿Cómo puedo pasar de forma segura una ruta de acceso arbitrariamente profunda a una aplicación web (Frasco, en este caso)?
Parece sensato dividir la ruta en niveles, así que envío templates
y example.html
por separado y luego los vuelvo a unir en el servidor. Esto funciona muy bien, excepto que el camino puede ser arbitrariamente profundo. Podría simplemente juntar dir1/dir2/dir3/dir4
y esperar que nadie sea más profundo que dir4
, pero parece tonto.
¿Cuál es la forma correcta de manejar la validación de rutas de profundidad desconocida? Validar de manera diferente? ¿Enviar los datos de manera diferente? Codifique la ruta de manera diferente, luego decodifíquela en el servidor?
Ese es su navegador que resuelve la ruta. Por sí solo, el convertidor de ruta no desinfecta la ruta. Vea mi respuesta a continuación para encontrar la solución adecuada para ese problema. –
Estoy de acuerdo con Armin. Confiar en '' para asegurar una ruta de archivo no es suficiente y es un gran agujero de seguridad. –