Я пытаюсь обработать REQUEST_BODY веб-запроса, в котором есть Content-Type: text / xml и некоторый XML внутри него. Допустим, у меня есть следующий запрос:
curl -v -d
"
<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<value>
<struct>
<member>
<name>SomeName</name>
<value>SomeValue</value>
</member>
</struct>
</value>
</methodResponse>
"
-H "Content-Type:text/xml" http://gryzli.info/some_url.php
Что мне нужно, так это иметь возможность сопоставить REQUEST_BODY с SomeName или SomeValue в виде простой текстовой строки.
Я уже пробовал следующее:
1. Попытка найти соответствие на этапе 2 со следующими ключевыми словами:
SecRule REQUEST_BODY "SomeValue" "phase:2, ....." - No success
SecRule FULL_REQUEST "SomeValue" "phase:2, ....." - No success
SecRule ARGS "SomeValue" "phase:2, ....." - No success
2. Помимо правил выше, я пробовал активировать эти правила в разных комбинациях:
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:requestBodyProcessor=MULTIPART"
ИЛИ
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:requestBodyProcessor=URLENCODED"
ИЛИ
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:forceRequestBodyVariable=On"
Очередной раз - безуспешно.
Настоящий вопрос:
Кто-нибудь знает, как сопоставить простую текстовую строку внутри REQUEST_BODY, когда мой клиентский запрос имеет Content-Type: text / xml?
Также я предпочитаю НЕ использовать механизм XML, который может анализировать мой XML, потому что я ожидаю большого снижения производительности при этом.
Наконец, я нашел ответ для сопоставления значения открытого текста в типе содержимого XML, вот пример:
SecRequestBodyAccess On
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1, nolog,pass,ctl:requestBodyProcessor=URLENCODED, id:2222"
SecRule REQUEST_BODY "some_bad_string" "phase:2, t:none, deny,msg:'Matched some_bad_string', status:500,auditlog, id:3333"
Вот что он делает:
В «фазе: 1» (фаза REQUEST_HEADERS) сопоставить, если Content-Type - «text / xml:». Если да, то измените двигатель обработки тела на "URLENCODED"
В "фазе: 2" (фаза REQUEST_BODY) сопоставить строку открытого текста "some_bad_string"и заблокировать запрос кодом состояния: 500.