Как я могу ограничить размер HTTP-запросов POST в mod_perl?

Я работаю над страницей, которая принимает файлы для загрузки. Теоретически я могу определить, когда файл, который они отправляют мне, слишком велик (просмотрев Content-Length их ответа), и отказаться принимать загрузку, возвращая ошибку HTTP 413 «Request Entity Too Large».

Однако кажется, что просто этого недостаточно - по крайней мере, Firefox будет продолжать отправлять остальную часть файла (что может занять много времени), прежде чем она покажет мою страницу с ошибкой.

В спецификации HTTP говорится, что я: "МОЖЕТ закрыть соединение, чтобы предотвратить продолжение запроса клиентом ". Однако выполнение либо 'close STDIN', 'shutdown STDIN, 0', или другого варианта этого не помогает - Firefox по-прежнему отправляет файл.

Я подозреваю, что, когда мой обработчик mod_perl закрывает соединение, он просто закрывает соединение между собой и Apache; Apache поддерживает соединение между собой и клиентом. Есть ли способ сказать Apache закрыть соединение? В остальном это кажется отличным вектором DoS.

Любые предложения приветствуются.


person pioto    schedule 11.12.2009    source источник
comment
Вы также можете подумать о том, что запрос разбивается на фрагменты, и поэтому вы не узнаете размер тела запроса, пока не будут получены все фрагменты ...   -  person Tor Valamo    schedule 12.12.2009


Ответы (2)


Вы изучали возможности ограничения Apache (в отличие от Perl)? Я не знаю в деталях, как директива LimitRequestBody работает с слишком большие запросы, но, по крайней мере, теоретически это похоже на настройку, предназначенную для блокирования атак.

person Pekka    schedule 11.12.2009

Да, неважно, что Perl делает с STDIN или STDOUT, Apache все равно разрешит загрузку, прежде чем он даже проверит, что происходит с вашим CGI. Вы можете закрыть STDIN, STDOUT или даже exit() (хотя вы не можете этого сделать, поскольку ваш процесс является постоянным), но ничего из этого не будет иметь никакого эффекта до тех пор, пока после Apache не завершит принятие запроса POST в своем целостность. То же самое и с любыми типами заголовков статуса, которые вы можете сгенерировать, например, 413 для «Запрос слишком большой».

Следовательно, вам необходимо, чтобы Apache отклонял запросы POST сверх определенного размера, чтобы это работало, например, используя LimitRequestBody как предложено Пеккой.

person Adam Bellaire    schedule 11.12.2009
comment
mod_cgi и mod_perl - разные модули. - person Alexandr Ciornii; 12.12.2009
comment
@ Александр: Да ...? Извините, я не понимаю. - person Adam Bellaire; 12.12.2009
comment
Я думаю, он имел в виду, что в mod_perl вы можете запустить обработчик ДО того, как публикация будет завершена. Это позволяет вам отменить публикацию во время ее выполнения, а не ждать завершения загрузки. - person Rahly; 30.01.2012