2

特定の脆弱性スキャンに関連する特定のエントリを Apache ログ ファイルで検索しようとしています。別のファイルの文字列をウェブログの URI コンテンツと照合する必要があります。検索しようとしている文字列の一部に、「?」などの特殊文字の繰り返しが含まれています。

たとえば、文字列「????????」のみを含む攻撃に一致できる必要があります。しかし、文字列 '??????????????????' でアラートを受け取りたくありません。各攻撃は特定の攻撃 ID 番号に関連付けられているためです。したがって、次を使用します。

if attack_string in log_file_line:
    alert_me()

...動作しないでしょう。このため、文字列を正規表現に入れることにしました。

if re.findall(r'\%s' % re.escape(attack_string),log_file_line):
    alert_me()

...文字列「????????」を含むログファイル行があるため、どちらも機能しませんでした '?'が8個以上あってもマッチします。ログファイルの行に。

次に、正規表現に境界を追加してみました:

if re.findall(r'\\B\%s\\B' % re.escape(attack_string),log_file_line):
    alert_me()

...どちらの場合も一致しなくなりました。探している文字列を動的に割り当てる必要がありますが、文字列を含む行だけで一致させたくありません。どうすればこれを達成できますか?

4

1 に答える 1

1

どうですか:

(?:[^?]|^)\?{8}(?:[^?]|$)

説明:

(?-imsx:(?:[^?]|^)\?{8}(?:[^?]|$))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    [^?]                     any character except: '?'
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    ^                        the beginning of the string
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
  \?{8}                    '?' (8 times)
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    [^?]                     any character except: '?'
----------------------------------------------------------------------
   |                        OR
----------------------------------------------------------------------
    $                        before an optional \n, and the end of
                             the string
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
于 2012-10-04T08:12:14.267 に答える