Как безопасно проверить размер загружаемого файла в бутылочку?

Я действительно боюсь этой операции read() потому что она использует память. Например, кто-нибудь может DDoS мой сервер, загрузив 1gb-файл, правильно?

 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)) 

Есть ли безопасное решение для загрузки загруженного размера файла? Предполагалось, что размер файла будет равен файловой системе; request.files.get('data') , вероятно, хранится где-то в временном файле?

Можете ли вы проверить, можете ли вы читать куски данных, по одному за раз.

Если это возможно, тогда:

 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)) 

Если это возможно, вы также сможете добавить механизм отслеживания того, насколько большой файл вы хотите прочитать, а если превышено, прервите эту операцию.

Как бы то ни было, это решает только один из возможных способов DDOS.

Это интересный вопрос. Обычно вы можете получить статистику по файловому объекту или использовать os.path для получения размера. Этот вопрос был рассмотрен ранее.

Но вы спрашиваете, как сообщить размер файла на стороне клиента с сервера, прежде чем мы потратим время на его загрузку. Я думаю, что лучший способ сделать это – с помощью JavaScript . Этот вопрос поможет вам начать работу над тем, как получить код JavaScript в приложении BottlePy.

Используйте JavaScript, чтобы проверить свой ввод, чтобы вы могли предположить в своем серверном коде, что файл находится в ваших пределах. Как только вы это выясните, я предлагаю, чтобы вы попросили пользователей BottlePy добавить поддержку этого непосредственно в поддержку BaseRequest.files.