Странности в регулярном выражении fail2ban - PullRequest
1 голос
/ 10 июля 2020

Похоже, это ошибка в fail2ban, с различным поведением у инструмента fail2ban-regex и фильтра failregex

Я пытаюсь разработать новое правило регулярного выражения для fail2ban, чтобы match:

\"%20and%20\"x\"%3D\"x

При использовании fail2ban-regex это дает желаемый результат:

^<HOST>.*GET.*\\"%20and%20\\"x\\"%3D\\"x.* 200.*$

Как это:

^<HOST>.*GET.*\\\"%20and%20\\\"x\\\"%3D\\\"x.* 200.*$

Однако, когда я помещаю любой из них в фильтр, я получаю следующую ошибку:

Failed during configuration: '%' must be followed by '%' or '(', found:…

Чтобы иметь для этой работы в фильтре вы должны удвоить '%', ie '%%':

^<HOST>.*GET.*\\\"%%20and%%20\\\"x\\\"%%3D\\\"x.* 200.*$

Хотя это позволяет получить необходимые совпадения, работающие как фильтр, он не запускается через fail2ban-regex.

Я пробовал \\\\, как предложил Андре, ниже, но это не дает результатов в fail2ban-regex.

Итак, поскольку это похоже на разницу поведение, я собираюсь зарегистрировать это как ошибку.

1 Ответ

0 голосов
/ 10 июля 2020

Согласно собственному сайту Python, один бэксла sh "\" должен быть записан как "\\\\", и % не упоминается.

Использование регулярных выражений символ backsla sh ('') для обозначения специальных форм или разрешения использования специальных символов без указания их особого значения. Это противоречит тому, что Python использует тот же символ с той же целью в строковых литералах; например, чтобы соответствовать буквальному backsla sh, можно было бы написать '\\' в качестве строки шаблона, потому что регулярное выражение должно быть \, а каждый backsla sh должен быть выражен как \ внутри обычного Python строковый литерал

Я бы просто go с:

failregex = (?i)^<HOST> -.*"(GET|POST|HEAD|PUT).*20and.*3d.*$

.* в любом случае будет соответствовать чему-либо между ними, а (?i) делает все регулярное выражение без учета регистра

...