如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章