SecResponseBodyAccess
说明:配置响应体是否将被缓冲和分析。
语法:SecResponseBodyAccess On|Off
例子:SecResponseBodyAccess On
处理阶段:无
适用范围:任何
版本:2.0.0
属地/注:如果你计划检查的HTML输出这个指令是必须的。本指令必须和“阶段:4”(phase:4)以及响应体变量或地址(RESPONSE_BODY variable/location)一起使用。这3部分缺一不可。
可选值是:
On – 访问请求体(只在MIME类型匹配,见上文)。
Off - 不试图访问响应体。
SecRule
说明:SecRule是ModSecurity的主要指令。它用来在分析数据的基础上执行动作。
语法:SecRule VARIABLES OPERATOR [ACTIONS]
例子:SecRule REQUEST_URI "attack" \
"phase:1,t:none,t:urlDecode,t:lowercase,t:normalisePath"
处理阶段:任何
适用范围:任何
版本:2.0.0
备注:无
在一般情况下,这一规则的格式如下:
SecRule VARIABLES OPERATOR [ACTIONS]
第二部分,操作符,指定他们将怎样检查。第三部分,动作,指定当一个操作符成功匹配变量时将执行怎样一个动作。
规则里的变量
第一部分,变量,指定哪些变量将进行检查。例如,下面的规则是当地址栏里有”dirty”这个单词时会拒绝交互:
SecRule ARGS dirty
每个规则可以指定一个或多个变量:
SecRule ARGS|REQUEST_HEADERS:User-Agent dirty
还有第三种格式的选择符 - XPath表达式的支持。 XPath表达式只能用来对付特殊的XML变量,只用请求体中的变量作为XML被处理的时候可用。
SecRule XML:/ XPath/Expression dirty
注意:并非所有的集合都支持所有的操作符格式。你应该查阅每个集合的文档检查是否支持。
集合 一个变量可以包含一个或多个数据块,这取决于该变量的性质和它的使用方式。我们已经看到了在上一节两个例子。当一个变量包含多个值时我们称它为一个集合。
集合在规则运行之前总是扩展的。例如,下面的规则:
SecRule ARGS dirty
可以扩展为:
SecRule ARGS:p dirty
SecRule ARGS:q dirty
在一个请求里只有两个参数,分别为p和q
集合有以下几种特性:
只读
在运行时用交互数据创建。例如: ARGS(包含所有请求参数值列表)和REQUEST_HEADERS(包含所有请求标头值的列表)。
瞬态读/写
TX集合在每一个交互中都生成。规则可以从中读取并且可以写入(例如,使用的SETVAR动作),但在此集合中存储的信息并不持续至交互结束。
持续的读/写
有几个集合,能被写入并且持久存储。这些集合可在交互中跟踪客户。这类集合的例子是
IP,SESSION和USER。
规则里的操作符最简单的情况是用一个正则表达式作为第二个规则参数。这也是我们在上面的例子中所使用的。
如果你这样做ModSecurity就假定你要使用rx(正则表达式),你也可以显式地指出通过使用@符号,其中@符号紧跟着操作符的名字,并且在第二个SecRule参数的开头。例如:
SecRule ARGS “@rx dirty”
这里我们应该注意到规则里的第二个参数使用了双引号作为界定符,这是因为第二个参数里包含空格,任何个数的空格可紧跟着操作符名称,如果那里有任何非空格字符,他们将被视为一个特殊的参数作为操作符。在正则表达式运算符里特殊参数的例子是将他们用于比较的模式。
如果使用否定符来返回否定的结果,@可以作为第二个字符,例如:
SecRule &ARGS "!@rx ^0$"
否定操作符
通过在第二个参数开始使用一个感叹号可返回一个否定结果。下面的规则匹配如果单词dirty不出现在User-Agent请求头:
SecRule REQUEST_HEADERS:User-Agent !dirty
您可以组合使用任何参数用感叹号。如果这样做,感叹号需要放在首位,紧跟着操作符参数。下面的规则与前面的例子有相同的效果:
SecRule REQUEST_HEADERS:User-Agent "!@rx dirty"
如果您需要使用否定在一个规则里,并且它将用于几个变量,,可能不会立即清楚将会发生什么。考虑下面的例子:
SecRule ARGS:p|ARGS:q !dirty
上述规则等效于:
SecRule ARGS:p !dirty
SecRule ARGS:q !dirty
警告
否定针对个别操作符,而不是针对整个变量列表。
规则里的动作
第三个参数,ACTIONS,可以省略,因为有一个辅助功能,即它可以在默认的动作清单中指定。
如果这个参数不省略,它将和默认动作清单合并,则规则匹配时执行实际的动作列表。