¿El siguiente fragmento de código de una aplicación Python WSGI está a salvo del recorrido del directorio? Lee un nombre de archivo pasado como parámetro y devuelve el archivo nombrado.¿Mi código impide el cruce del directorio?
file_name = request.path_params["file"]
file = open(file_name, "rb")
mime_type = mimetypes.guess_type(file_name)[0]
start_response(status.OK, [('Content-Type', mime_type)])
return file
I montado la aplicación bajo http://localhost:8000/file/{file}
y enviado solicitudes con las URL http://localhost:8000/file/../alarm.gif
y http://localhost:8000/file/%2e%2e%2falarm.gif
. Pero ninguno de mis intentos entregó el archivo (existente). Entonces, ¿mi código ya está a salvo del cruce de directorios?
Nuevo enfoque
Parece que el siguiente código impide recorrido de directorio:
file_name = request.path_params["file"]
absolute_path = os.path.join(self.base_directory, file_name)
normalized_path = os.path.normpath(absolute_path)
# security check to prevent directory traversal
if not normalized_path.startswith(self.base_directory):
raise IOError()
file = open(normalized_path, "rb")
mime_type = mimetypes.guess_type(normalized_path)[0]
start_response(status.OK, [('Content-Type', mime_type)])
return file
¿Qué sucede si le das una ruta absoluta? – katrielalex
¡Buena idea! Tu sugerencia me llevó a la respuesta: ¡es inseguro! El recorrido del directorio fue "accidentalmente" prevenido por otra parte del marco utilizado. – deamon