Назад | Перейти на главную страницу

Modsec: установить переменную env на основе пользовательского агента

Относительно новый для Apache modsec. Пытаюсь сделать что-то простое и врезаюсь в стену. Я хочу установить переменную среды на основе User-Agent и протестировать ее, установив заголовок. У меня есть это:

SecRule HTTP_User_Agent "Gecko" "phase:2,nolog,setenv:MOZTEST=1,id:100000025"
Header always set MozTest "1" env=MOZTEST

Прикинул, что в Firefox должен быть установлен заголовок MozTest, но это не так. Я также пробовал REQUEST_HEADERS: User-Agent вместо HTTP_User-Agent, но все равно никакого эффекта. Также попытался увеличить фазу до 5, хотя пользовательский агент должен быть на фазе 2. Ошибки нет; правило просто не срабатывает.

Я предполагаю, что переменная пользовательского агента не установлена, но я не знаю почему. (Или даже как это проверить, поскольку мне никогда не приходилось делать никаких пользовательских журналов.)

Я наткнулся на свой вопрос во время исследования другой проблемы спустя годы.

Похоже, основная проблема здесь в том, что я пытался использовать переменную mod_rewrite (HTTP_USER_AGENT) в контексте mod_security. Вместо этого я мог бы либо использовать правильную переменную ModSecurity (REQUEST_HEADERS: User-Agent), либо передать переменную перезаписи мода в качестве переменной среды (не то чтобы для этого была веская причина, когда доступна альтернатива ModSecurity).

Итак, мой пример выше должен выглядеть так:

SecRule REQUEST_HEADERS:User-Agent "Gecko" "phase:2,nolog,setenv:MOZTEST=1,id:100000025"
Header always set MozTest "1" env=MOZTEST

Полный список переменных, доступных для ModSecurity, находится здесь: https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual-(v2.x)#Variables

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

RewriteRule .* - [E=user_agent:%{HTTP_USER_AGENT}]
SecRule ENV:user_agent "Gecko" "phase:2,nolog,setenv:MOZTEST=1,id:100000025"
Header always set MozTest "1" env=MOZTEST