Регулярное выражение не соответствует тестовой строке

Почему следующее регулярное выражение не соответствует следующему тексту?

Regex:

\[\]\s\[(:?error|\S+:\S+)\]( \[pid \d+(:\S+ \d+)?\])? \[client <HOST>(:\d{1,5})?\] ModSecurity:\s+(?:\[(?:\w+ \"[^\"]*\"|[^\]]*)\]\s*)*Access denied with code [45]\d\d

Тестовая строка:

[Sun Mar 15 22:28:19.733272 2018] [:error] [pid 11954] [client 188.191.122.27:62165] [client 188.191.122.27] ModSecurity: Access denied with code 403 (phase 2). Operator GE matched 4 at TX:anomaly_score. [file ".../modsecurity.d/owasp-modsecurity-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "57"] [id "949110"] [msg "Inbound Anomaly Score Exceeded (Total Score: 5)"] [severity "CRITICAL"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "63.60.128.135"] [uri "/phpmyadmin/phpmyadmin/index.php"] [unique_id "W0uuY3C8AA4EAA5OC7wBAAAH"]

Это предопределенное правило из fail2ban и случайная запись в журнале apache с измененными адресами.

Сначала я подумал, что ошибка в том, что клиент регистрируется дважды, поэтому я изменил строку клиента:

(\[client <HOST>(:\d{1,5})?\])+

Но это тоже не сработало.

Просто чтобы прояснить ситуацию:

 Regular expressions (failregex, ignoreregex) assume that the date/time has been removed from the log line (this is just how fail2ban works internally ATM).

 If the format is like „<date...> error 1.2.3.4 is evil“ then you need to match the < at the start so regex should be similar to „^<> <HOST> is evil$„ using <HOST> where the IP/domain name appears in the log line.

(Взято из документа fail2ban: https://fail2ban.readthedocs.io/en/latest/filters.html) (Я написал это как код, потому что в stackru, похоже, возникают проблемы с отображением определенных символов в кавычках.)

Я более или менее новичок в регулярных выражениях, так что спасибо за любую помощь.

1 ответ

Решение

Вы были близки Когда вы добавили повторяющуюся группу для нескольких клиентов, вы не включили в нее пространство, разделяющее их.

\[\]\s\[(:?error|\S+:\S+)\]( \[pid \d+(:\S+ \d+)?\])?( \[client <HOST>(:\d{1,5})?\])+ ModSecurity:\s+(?:\[(?:\w+ \"[^\"]*\"|[^\]]*)\]\s*)*Access denied with code [45]\d\d

DEMO

Другие вопросы по тегам