我已经编写了一个Apache2.x模块,它尝试扫描请求正文,如果某些模式匹配,则有条件地返回403禁止。
我的第一次尝试使用ap_hook_handler
截取请求,扫描它,然后将DECLINED
返回给实际的处理程序可以接管(如果条件满足,则返回403 )。
这种方法的问题是,当我读取请求的POST主体(使用ap_get_client_block
和朋友)时,它显然消耗了主体,因此如果请求随后被mod_proxy处理,主体就消失了。
我认为扫描正文的正确方法是使用输入筛选器,但输入筛选器只能返回APR_SUCCESS
或fail。除了APR_SUCCESS之外的任何返回代码都会被转换为HTTP 400 Bad Request
。
我想,如果输入过滤器想要使请求失败,也许我可以在请求注释中存储一个标志,但我不确定以后使用哪个钩子来获得该标记。
发布于 2018-06-04 07:51:30
事实证明非常简单-只需将一个错误存储桶放入brigade:
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);
https://stackoverflow.com/questions/50654166
复制相似问题