c - 如何从 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
。
如果输入过滤器想要使请求失败,我想也许我可以在请求注释中存储一个标志,但我不确定以后哪个钩子可以得到它。
解决方案
结果很容易 - 只需将一个错误桶放入该旅:
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);
推荐阅读
- grafana - 将多个值减少为单个值
- python - 如果单元格值的年份小于特定年份,则删除 Excel 行
- json - 我需要帮助来确定现有 PostgreSQL 数据库中视图的语法,该数据库在 JSON 数组字段中提取(取消嵌套)内容
- c# - Unity列出敌人并将它们从所述列表中删除不起作用
- c - 我可以通过记忆改进这个递归函数吗?
- arcore - 使用 EXC_BAD_ACCESS 在 iOS 14 上导出失败的 AugmentedFacesExample
- python - 从 df.query() 字符串获取左右边界
- react-native - 如何在 react-native 中同时从外部设置多个组件的样式?
- flutter - 颤振滞后动画
- spring-boot - 如何按需读取来自 Kafka 主题的消息