如何从 apache Web 服务器输入过滤器返回 HTTP 403?

Posted

技术标签:

【中文标题】如何从 apache Web 服务器输入过滤器返回 HTTP 403?【英文标题】:How can an HTTP 403 be returned from an apache web server input filter? 【发布时间】: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

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

【问题讨论】:

【参考方案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() 中设置的自定义代码。你有什么想法,我该如何调试?

以上是关于如何从 apache Web 服务器输入过滤器返回 HTTP 403?的主要内容,如果未能解决你的问题,请参考以下文章

从返回域对象列表的 RESTful Web 服务端点的响应中动态过滤字段

web.xml 和/或过滤器返回欢迎文件

如何使用 vue/vuex 从输入中过滤数据?

springMVC拦截器中如何获得被拦截方法的返回值

Apache代理fcgi错误

从apache Web服务器访问正确的网站文件[关闭]