我编写了一个 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
。
如果输入过滤器想要使请求失败,我想也许我可以在请求注释中存储一个标志,但我不确定以后哪个钩子可以得到它。