fail2ban正则表达式嵌套还是bug?

时间:2016-08-14 00:41:02

标签: regex fail2ban

所以今天我试图为fail2ban过滤器整理一些正则表达式。这是我注意到fail2ban在正则表达式模式中嵌套OR的问题。

输入字符串:127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a

模式:^<HOST> -.*\"(c|b)|a

以下是一个例子:

$ fail2ban-regex "127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] \"a" '^<HOST> -.*\"(c|b)|a'

Running tests
=============

Use   failregex line : ^<HOST> -.*\"(c|b)|a
Use      single line : 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a


Results
=======

Failregex: 0 total

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] Day/MONTH/Year:Hour:Minute:Second
`-

Lines: 1 lines, 0 ignored, 0 matched, 1 missed
|- Missed line(s):
|  127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a
`-

我已经注意到,如果您运行正则表达式模式a|(c|b),这实际上会成功并报告匹配,但是我需要能够检查第一个OR的两侧以查看是否第一个条件匹配(例如,如果HTTP请求类型不是POST或GET),忽略正则表达式模式的其余部分,否则在第一个OR之后运行剩余的正则表达式模式。另一件事是分组似乎并不重要,因为在最外层的OR的第一部分,它总是看似匹配。

我们得到一个匹配:

$ fail2ban-regex "127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] \"a" '^<HOST> -.*\"a|(c|b)'

Running tests
=============

Use   failregex line : ^<HOST> -.*\"a|(c|b)
Use      single line : 127.0.0.1 - - [13/Aug/2016:07:01:45 -0400] "a


Results
=======

Failregex: 1 total
|-  #) [# of hits] regular expression
|   1) [1] ^<HOST> -.*\"a|(c|b)
`-

Ignoreregex: 0 total

Date template hits:
|- [# of hits] date format
|  [1] Day/MONTH/Year:Hour:Minute:Second
`-

Lines: 1 lines, 0 ignored, 1 matched, 0 missed

我说这可能是一个错误,因为我对regex101.com和debuggex.com这样的网站进行了测试,报告了这两种正则表达式模式的匹配。

1 个答案:

答案 0 :(得分:1)

这个正则表达式:

^<HOST> -.*\"(c|b)|a

...与此相同:

a|^<HOST> -.*\"(c|b)

唯一的区别是尝试替代品的顺序。如果正则表达式都是重要的,那么这应该与任何一种方式相匹配。但是,快速查看fail2ban docs告诉我每个failregex必须与请求关联的主机名/ IP匹配。您在那里基本上有两个正则表达式^<HOST> -.*\"(c|b)a),其中一个不包含<HOST>

我不确定你要完成什么,但是如果你不能通过将管道放在parens((a|b|c))内来完成它,你可能需要使用两个单独的正则表达式。