Estoy intentando procesar REQUEST_BODY de una solicitud web, que tiene un tipo de contenido: texto/xml y algo de XML en su interior. Digamos que tengo la siguiente solicitud:
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
Lo que necesito es poder hacer coincidir REQUEST_BODY con "SomeName" o "SomeValue" como una cadena de texto sin formato.
Ya he probado las siguientes cosas:
1. Intentando hacer coincidir la fase 2, con las siguientes palabras clave:
SecRule REQUEST_BODY "SomeValue" "phase:2, ....." - No success
SecRule FULL_REQUEST "SomeValue" "phase:2, ....." - No success
SecRule ARGS "SomeValue" "phase:2, ....." - No success
2. Además de las reglas anteriores, intenté activar estas reglas en diferentes combinaciones:
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:requestBodyProcessor=MULTIPART"
O
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:requestBodyProcessor=URLENCODED"
O
SecRule REQUEST_HEADERS:Content-Type "text/xml" "phase:1,id:100000,t:lowercase,nolog,pass, ctl:forceRequestBodyVariable=On"
De nuevo -sin éxito.
La verdadera pregunta:
¿Alguien sabe cómo hacer coincidir una cadena de texto sin formato simple dentro de REQUEST_BODY cuando la solicitud de mi cliente es de tipo de contenido: text/xml?
Además, prefiero NO utilizar el motor XML, que puede analizar mi XML, porque espero una gran pérdida de rendimiento al hacer esto.
Respuesta1
Finalmente, encontré la respuesta para hacer coincidir un valor de texto sin formato en el tipo de contenido XML, aquí está el ejemplo:
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"
Esto es lo que hace:
En "fase:1" (fase REQUEST_HEADERS), haga coincidir si el tipo de contenido es "texto/xml:". En caso afirmativo, cambie el motor de procesamiento del cuerpo a "URL CODIFICADA"
En "fase:2" (fase REQUEST_BODY), haga coincidir la cadena de texto sin formato "alguna_cadena_mala" y bloquear la solicitud con el código de estado: 500.