Content-Type: text/xml 및 그 안에 일부 XML이 포함된 웹 요청의 REQUEST_BODY를 처리하려고 합니다. 다음과 같은 요청이 있다고 가정해 보겠습니다.
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"
다시 -성공없이.
실제 질문:
내 클라이언트 요청이 Content-Type: text/xml 일 때 REQUEST_BODY 내부의 간단한 일반 텍스트 문자열을 일치시키는 방법을 아는 사람이 있습니까?
또한 나는 XML을 구문 분석할 수 있는 XML 엔진을 사용하지 않는 것을 선호합니다. 왜냐하면 이렇게 하면 성능이 크게 저하될 것으로 예상되기 때문입니다.
답변1
마지막으로 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"
그 기능은 다음과 같습니다.
"phase:1"(REQUEST_HEADERS 단계)에서 Content-Type이 "text/xml:"인 경우 일치합니다. 그렇다면 본체 처리 엔진을 "URL이 인코딩됨"
"phase:2"(REQUEST_BODY 단계)에서 일반 텍스트 문자열 "과 일치합니다.some_bad_string" 상태 코드 500으로 요청을 차단합니다.