【问题标题】:How can an HTTP 403 be returned from an apache web server input filter?如何从 apache Web 服务器输入过滤器返回 HTTP 403?
【发布时间】:2018-11-12 05:30:54
【问题描述】:

我编写了一个 apache 2.x 模块,它尝试扫描请求正文,如果某些模式匹配,则有条件地返回 403 Forbidden。

我的第一次尝试使用ap_hook_handler 来拦截请求,对其进行扫描,然后将DECLINED 返回给可以接管的真正处理程序(如果满足条件,则返回403)。

这种方法的问题是,当我读取请求的 POST 正文时(使用 ap_get_client_block 和朋友),它显然消耗了正文,因此如果请求随后由 mod_proxy 处理,则正文消失了。

我认为扫描正文的正确方法是使用输入过滤器,但输入过滤器只能返回 APR_SUCCESS 或失败。除 APR_SUCCESS 之外的任何返回代码都将转换为 HTTP 400 Bad Request

如果输入过滤器想要使请求失败,我想也许我可以在请求注释中存储一个标志,但我不确定以后哪个钩子会得到那个。

【问题讨论】:

    标签: c apache apache2 apache2.4 apache2-module


    【解决方案1】:

    结果非常简单 - 只需将一个错误桶放入该旅即可:

    apr_bucket_brigade *brigade = apr_brigade_create(f->r->pool, f->r->connection->bucket_alloc);
    apr_bucket *bucket = ap_bucket_error_create(403, NULL, f->r->pool,
            f->r->connection->bucket_alloc);
    APR_BRIGADE_INSERT_TAIL(brigade, bucket);
    bucket = apr_bucket_eos_create(f->r->connection->bucket_alloc);
    APR_BRIGADE_INSERT_TAIL(brigade, bucket);
    ap_pass_brigade(f->next, brigade);
    

    【讨论】:

    • 我正在尝试使用您的解决方案,但服务器总是给出 400,而不是我在 ap_bucket_error_create() 中设置的自定义代码。你有什么想法,我该如何调试?
    猜你喜欢
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2015-07-13
    • 2016-12-31
    • 2020-03-14
    相关资源
    最近更新 更多