2012-01-23 3 views
4

Я пытаюсь понять наилучший способ обработки загрузки файлов safely в приложении wsgi. Похоже, что многие решения включают использование FieldStorage из модуля cgi для анализа данных формы. Из того, что я понимаю в FieldStorage, он выполняет немного «волшебства» за кулисами, передавая данные в tempfile.Как вы ограничиваете загрузку больших файлов в wsgi?

Что я не на 100% очищаю, так это то, как ограничить запрос, содержащий файл, превышающий указанную сумму (скажем, 10 МБ). Если кто-то загружает файл размером в несколько ГБ, вы, очевидно, хотите заблокировать запрос, прежде чем он жует через дисковое пространство вашего сервера?

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

+0

Этот вопрос отмечен 'wsgi'. Вы используете интерфейс WSGI напрямую? Если это так, то это должно быть кусок торта для управления объемом данных, которые вы читаете из 'environ ['wsgi.input']' (и проверьте заголовок 'Content-Length'). –

ответ

3

Это будет зависеть от вашего внешнего сервера. Если у него есть какая-либо конфигурация для блокировки большого запроса, даже до того, как он войдет в ваше приложение, используйте его.

Если вы хотите, чтобы заблокировать это с кодом я вижу два подхода:

  • Посмотрите съела Content-Length заголовка HTTP. Если он больше, чем вы можете справиться, немедленно отклоните запрос.
  • Не доверяйте заголовкам и начинайте читать тело запроса, пока не достигнете своего предела. Обратите внимание, что это не очень умный способ, но он может работать. =)

Доверяя HTTP-заголовку, вы можете столкнуться с некоторыми проблемами. Предположим, что кто-то отправляет запрос с Content-Length: 1024, но отправляет тело запроса 1GB. Если ваш front-end сервер доверяет заголовку, он начнет читать этот запрос и позже узнает, что тело запроса на самом деле намного больше, чем должно быть. Эта ситуация все равно может заполнить ваш серверный диск, даже будучи запросом, который «передает» слишком большую проверку.

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

+1

Не должен ли сервер HTTP обрабатывать неправильную ситуацию «Content-Length»? Я думал, что реализации, совместимые с HTTP/1.1, должны отказаться от дополнительного контента. Кроме того, они должны это делать, если они хотят, чтобы HTTP продолжал жить (иначе не было бы способа узнать, когда начнется следующий запрос). –

+0

Вы правы! Но в любом случае было бы сложно обнаружить, когда запрос на самом деле больше, чем значение в заголовке Content-Length. Служба должна прочитать запрос до тех пор, пока не достигнет Content-Length + 1 байт, но, возможно, есть более разумный способ сделать это. –

+0

Сервер уже считывает запрос, так как он должен извлекать заголовки и перенаправлять тело запроса из сокета в приложение WSGI. Кроме того, сервер не может утверждать, что он является HTTP/1.1. если он не выполняет проверку. –

0

Вы можете использовать функции HTTP-сервера, вероятно, у вас есть перед вашим приложением WSGI. Например, lighttpd имеет many options for traffic shaping.

 Смежные вопросы

  • Нет связанных вопросов^_^