Как вернуть HTTP 403 из входного фильтра веб-сервера apache? - PullRequest
0 голосов
/ 02 июня 2018

Я написал модуль apache 2.x, который пытается сканировать тела запросов и условно возвращает 403 Запрещено, если совпадают определенные шаблоны.

Моя первая попытка использовала ap_hook_handler для перехвата запроса, отсканируйте его изатем вернул DECLINED, чтобы реальный обработчик мог вступить во владение (или 403, если были выполнены условия).

Проблема с этим подходом заключается в том, что я читаю тело запроса POST (используя ap_get_client_block и друзей),он, очевидно, потребляет тело, поэтому, если запрос был впоследствии обработан mod_proxy, тело исчезло.

Я думаю, что правильным способом сканирования тела было бы использование входного фильтра, за исключением того, что входной фильтр может возвращать толькоAPR_SUCCESS или не удастся.Любые коды возврата, кроме APR_SUCCESS, преобразуются в HTTP 400 Bad Request.

. Я думаю, что, возможно, я смогу сохранить флаг в примечаниях к запросу, если фильтр ввода хочет отклонить запрос, но я не уверен, какой позжекрюк, чтобы получить это.

1 Ответ

0 голосов
/ 04 июня 2018

оказалось довольно легко - просто бросьте в бригаду корзину с ошибками:

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