2009-12-11 1 views
7

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

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

HTTP spec говорит, что я: «МОЖЕТ закрыть соединение, чтобы клиент не продолжал запрос». Тем не менее, делая «закрытие STDIN», «shutdown STDIN, 0» или какой-то вариант этого, похоже, не делает трюк - Firefox все еще продолжает отправлять файл.

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

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

+0

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

ответ

6

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

1

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

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

+0

mod_cgi и mod_perl - это разные модули. –

+0

@ Александр: Да ...? Извините, я не следую. –

+0

Я думаю, что он имел в виду, что в mod_perl у вас может быть огонь обработчика, прежде чем сообщение будет завершено. Это позволяет отменить сообщение во время его выполнения, а не ждать завершения загрузки. – Rahly