2012-06-27 10 views
5

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?

+0

Si ejecuta bottle mediante wsgi en algo como apache, apache puede limitar los tamaños de carga. – jordanm

+1

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

Respuesta

2

Puede verificar si puede leer fragmentos de datos, uno a la vez.

Si esto es posible, entonces:

name = request.forms.get('name') 
data = request.files.get('data') 
raw = "" 
if name and data.file: 
    while True: 
     datachunk = data.file.read(1024) 
     if not datachunk: 
      break 
     raw = raw + datachunk 

    filename = data.filename 
    return "Hello %s! You uploaded %s (%d bytes)." % (name, filename, len(raw)) 

Si esto es posible, entonces debería ser capaz de añadir también un mecanismo de seguimiento del tamaño de un archivo que desea leer y si se excede cancelar la operación.

Sin embargo, esto resuelve solo una de las formas posibles de DDOS.

+0

podría arreglar su código? size = debe ser eliminado. esto produce TypeError: read() no toma argumentos de palabra clave, si solo 1024 especificó que funciona – holms

+0

@holms: Gracias por la corrección. Supuse que habría un argumento nombrado para pasar. Intente mirar el código, se puede nombrar algo más. – pyfunc

-3

Esta es una pregunta interesante. Normalmente, obtendría las estadísticas en el objeto de archivo o usar os.path para obtener el tamaño. This question ha sido cubierto anteriormente.

Pero usted está preguntando cómo contar el tamaño del archivo del lado del cliente desde el servidor antes de que dediquemos tiempo a cargarlo. Creo que la mejor manera de hacerlo es with JavaScript. This question puede comenzar a utilizar código de JavaScript en su aplicación BottlePy.

Utilice JavaScript para validar su entrada de modo que pueda asumir en su código de servidor que el archivo está dentro de sus límites. Una vez que lo resuelva, le sugiero que le pida a la gente de BottlePy que agregue soporte para esto directamente al soporte BaseRequest.files.

+0

'Pero usted está preguntando cómo contar el tamaño del archivo del lado del cliente desde el servidor antes de que dediquemos tiempo a subirlo. <- ¿en serio? No recuerdo haber escrito eso. puede cambiar ese campo a un tamaño que pase la validación y pase un archivo de 1 gb, entonces, ¿qué ...? – holms

+0

Oh, tal vez no entendí entonces. Pensé que querías obtener el tamaño de archivo sin exponerte a DDOS ... tal vez estaba asumiendo algo allí. La única manera de hacerlo es verificar el tamaño del archivo antes de subirlo, de lo contrario, cuál es el punto. El archivo grande ya está cargado, por lo que no evitó DDOS. La otra opción es como sugiere pyfunc, pero agregas un cheque para salir en algún límite. La última opción es como sugerir y obtener las estadísticas en el archivo temporal. – ChipJust

+0

@holms "puede cambiar ese campo al tamaño que pasa la validación, y pasar 1gb de modo que ¿qué ...?" No entiendo tu punto. Usted controla el código de validación del lado del cliente, para que pueda permitir el tamaño que desee ... – ChipJust

Cuestiones relacionadas