Как вернуть HTTP 403 из входного фильтра веб-сервера apache?
Я написал модуль 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);