首页 > 解决方案 > 如何从 apache Web 服务器输入过滤器返回 HTTP 403?

问题描述

我编写了一个 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

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

标签: capacheapache2apache2.4apache2-module

解决方案


结果很容易 - 只需将一个错误桶放入该旅:

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);

推荐阅读