【问题标题】:Rejecting a HTTP request before reading the body在读取正文之前拒绝 HTTP 请求
【发布时间】:2011-05-30 16:24:26
【问题描述】:

我正在开发一个用户需要上传一些非常大的文件的网站。该网站是用 PHP 编写的。

在某些情况下,我会根据标题拒绝文件。理想情况下,我想在收到标头后立即拒绝请求,而无需阅读正文。如果标题足以告诉该文件应该被拒绝,则没有理由读取 200M 文件。此外,当我接受请求时,我想定期保存在收到请求正文时读取的字节数。

我知道这在 PHP 中是不可能的,因为在 PHP 处理之前会读取整个 HTTP 请求。我的替代方案是什么?我从未使用过 Perl,但我读到 mod_perl 可以访问 Apache API。使用 mod_perl 可以做到这一点吗? Apache 模块?

【问题讨论】:

标签: apache http mod-perl


【解决方案1】:

使用标准的 PHP 处理程序几乎是不可能的。在请求被解析之前,您不会收到请求,不幸的是,没有好的方法可以推迟它。

编辑:我在使用 commons fileupload 库的流模式和 java.util.合并到 Apache 配置中有点麻烦,但如果您正在谈论 200M 文件,则非常值得节省带宽。

【讨论】:

    【解决方案2】:

    如果您可以硬编码拒绝文件的规则,则可以在 .htaccess 中使用 mod_rewrite 规则。使用 %{HTTP:header} 条件:

    RewriteCond %{HTTP:AcceptThisFile} False [NC]
    RewriteRule (...)
    

    【讨论】:

      【解决方案3】:

      有可以与“简单”正则表达式一起使用的 modsecurity。这进入 Apache2 并在收到整个文件之前执行。您可以先阅读一下文档:

      http://www.modsecurity.org/documentation/modsecurity-apache/2.5.5/modsecurity2-apache-reference.html

      您也可以保留默认规则,因为它们也会禁止许多无用的访问,尽管删除那些实际上会阻止您自己的网站正常工作的规则需要时间,因此删除所有这些默认规则可能是一个不错的选择想法。

      【讨论】:

        猜你喜欢
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多