描述:对提供的短语与所需输入值进行不区分大小写的匹配。运算符使用基于集合的匹配算法(Aho-Corasick),这意味着它将并行匹配任意数量的关键字。当需要匹配大量关键字时,此运算符比正则表达式执行得更好。


此运算符作用与@pm相同,只是它将文件列表作为参数。它将匹配目标值中任何位置的文件中列出的任何一个短语。


例:


#通过/path/to/blacklist1与blacklist2文件中包含的关键字检测可疑的User-Agent

#(blacklist2必须与blacklist1在同一个文件夹中)

SecRule REQUEST_HEADERS:User-Agent "@pmFromFile /path/to/blacklist1 blacklist2" "id:167"


注意:


文件每行必须包含一个短语。将从每个短语中去除行尾标记(LF和CRLF)以及从开头和结尾修剪的任何空白。空行和注释行(以#字符开头的行)将被忽略。

为了允许更容易地包含具有规则集的短语文件,可以将相对路径用于短语文件。在这种情况下,包含规则的文件的路径将添加到短语文件路径中。


@pm运算符短语不支持元字符。

因为此运算符在匹配时不检查字符边界,所以在某些情况下可能出现误报。例如,如果要使用@pm进行IP地址匹配,则1.2.3.4可能会匹配多个IP地址(例如,它也将匹配1.2.3.40或1.2.3.41)。为了避免误报,您可以在短语中定义自己的字符边界。例如,使用/1.2.3.4/而不是1.2.3.4。然后同时在规则适当的位置添加字符边界。例如:

#自定义REMOTE_ADDR变量

SecAction "phase:1,id:168,nolog,pass,setvar:tx.REMOTE_ADDR=/%{REMOTE_ADDR}/"


#检查REMOTE_ADDR是否在黑名单中

SecRule TX:REMOTE_ADDR "@pmFromFile blacklist.txt" "phase:1,id:169,deny,msg:'Blacklisted IP address'"


文件blacklist.txt中内容如下:

/1.2.3.4/

/5.6.7.8/

......

#注意:所有IP必须以“/”作为前缀与后缀,规则中也需要以“/”作为字符边界以确保可正确匹配IP

# SecAction "phase:1,id:170,pass,nolog,setvar:tx.remote_addr='/%{REMOTE_ADDR}/'"


警告:在ModSecurity 2.5.12之前,@ pmFromFile运算符仅理解LF行结尾,并且不会从短语中修剪空白。如果您使用的是较旧版本的ModSecurity,则在编辑短语文件时应注意避免在模式中使用不需要的字符。每行应包含一个短语。将从短语(LF和CRLF)中去除行尾标记,并从短语的两侧修剪空白。空行和注释行(以“#”开头)将被忽略。为了更容易包含带有规则集的短语文件,可以将相对路径用于短语文件。在这种情况下,包含规则的文件的路径将添加到短语文件路径中。

注意:从ModSecurity v2.6.0开始,此运算符支持snort / suricata内容样式。即:“A|42|C|44|F”。

注释II:从v2.9.0-RC1开始,此运算符还支持加载HTTPS服务器提供的内容。但是,一次只能使用一个URL。



Created with the Personal Edition of HelpNDoc: Easy EPub and documentation editor