Realmente le tengo miedo a esa operación read()
porque usa memoria. Por ejemplo, alguien podría hacer DDoS mi servidor cargando un archivo de 1 gb, ¿correcto?¿Cómo verificar el tamaño del archivo cargado de forma segura en bottlepy?
name = request.forms.get('name')
data = request.files.get('data')
if name and data.file:
raw = data.file.read() # This is dangerous for big files
filename = data.filename
return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw))
¿Hay alguna solución segura para obtener el tamaño del archivo subido? Una suposición sería obtener el tamaño del archivo del sistema de archivos; request.files.get('data')
es probable que esté almacenado en algún lugar en el archivo temporal ¿verdad?
Si ejecuta bottle mediante wsgi en algo como apache, apache puede limitar los tamaños de carga. – jordanm
Bottle almacena request.body y todos los archivos cargados en archivos temporales (o búferes ByteIO si son lo suficientemente pequeños) en cuanto accede a alguno de ellos. Si desea restringir el tamaño de carga antes de que el servidor haga todo el trabajo, verifique request.content_length. Si solo quiere asegurarse de que todo encaja en la memoria, lea/copie los archivos cargados en trozos más pequeños como lo describe pyfunc en su respuesta. – defnull