我正在开发一个接受文件上传的页面。从理论上讲,我可以 检测他们发送给我的文件是否太大(通过查看 内容 - 他们的回复长度),并拒绝接受上传, 返回HTTP 413“Request Entity Too Large”错误。
然而,似乎只是这样做还不够 - Firefox,at 至少,仍将继续发送文件的其余部分(可能需要一个 很长时间),在它显示我的错误页面之前。
HTTP spec说我:“可以关闭连接以阻止客户端 继续请求。“但是,要么'关闭STDIN', 'shutdown STDIN,0',或者某些变体似乎没有做到 技巧 - Firefox仍然不断发送文件。
我怀疑,当我的mod_perl处理程序关闭连接时,它就是 只是关闭自己和Apache之间的连接; Apache保持着 它和客户端之间的连接活着。有什么方法可以告诉 Apache关闭连接?否则,这看起来很棒 DoS矢量。
欢迎任何建议。
答案 0 :(得分:7)
您是否研究过Apache的限制功能(而不是Perl)?我不清楚LimitRequestBody
指令如何处理太大的请求,但至少在理论上它看起来像是一个旨在阻止攻击的设置。
答案 1 :(得分:2)
是的,Perl对STDIN
或STDOUT
的处理并不重要,Apache仍会允许上传继续进行甚至检查你的CGI会发生什么。您可以关闭STDIN
或STDOUT
甚至exit()
(尽管您的流程是持久性的,但您不能这样做),但在之后之后,这些都不会产生任何影响/ em> Apache完全接受了POST请求。与您可能生成的任何类型的状态标头类似,例如413
表示“请求太大”。
因此,您需要让Apache拒绝超出特定大小的POST请求才能使其生效,例如使用LimitRequestBody
作为suggested by Pekka。