8

我正在处理一个接受文件上传的页面。理论上,我可以检测到他们发送给我的文件何时过大(通过查看他们响应的 Content-Length),并拒绝接受上传,返回 HTTP 413“Request Entity Too Large”错误。

但是,似乎仅仅这样做是不够的——至少,Firefox 仍会在显示我的错误页面之前继续发送文件的其余部分(这可能需要很长时间)。

HTTP 规范说我:“可以关闭连接以防止客户端继续请求。” 但是,执行“关闭 STDIN”、“关闭 STDIN,0”或其他一些变体似乎都不起作用——Firefox 仍然继续发送文件。

我怀疑,当我的 mod_perl 处理程序关闭连接时,它只是关闭了自身与 Apache 之间的连接;Apache 保持它与客户端之间的连接处于活动状态。有什么方法可以告诉 Apache 关闭连接吗?否则,这似乎是一个很好的 DoS 向量。

欢迎大家提出意见。

4

2 回答 2

7

您是否探索过 Apache 的限制功能(相对于 Perl 的)?我不知道该LimitRequestBody指令如何处理太大的请求的详细信息,但至少在理论上它看起来像一个旨在阻止攻击的设置。

于 2009-12-11T20:21:14.643 回答
2

STDIN是的,Perl 对or做什么并不重要STDOUT,Apache 仍然会在它检查 CGI 发生的情况之前允许继续上传。您可以关闭STDINSTDOUT什至exit()(尽管您不能这样做,因为您的进程是持久的),但是Apache 完全接受 POST 请求之前,这些都不会产生任何影响。同样,您可能会生成任何类型的状态标头,例如413“请求太大”。

因此,您需要让 Apache 拒绝超过一定大小的 POST 请求才能正常工作,例如LimitRequestBody按照Pekka 的建议使用。

于 2009-12-11T21:12:07.350 回答