1

私は preg_match を使用して、評価済みの base64 でエンコードされたウイルスをファイル内で見つけて削除しています。

以下の正規表現:

/\s*eval\s*\(\s*base64_decode\s*\(\s*('[a-zA-Z0-9\+\/]*={0,2}'|"[a-zA-Z0-9\+\/]*={0,2}")\s*\)\s*\s*\)\s*(;)?\s*/

次のコードに一致します。

eval(base64_decode("BASE64+ENCODED+VIRUS+HERE")); 

上記の正規表現は正常に機能します。

連結によってワードラップされたbase64文字列と一致させたかったのです。したがって、次の "BASE64+EN" にも一致するはずです。「コード + ウイルス + ここ」。

そこで、正規表現を次のように変更しました。

/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*)*={0,2}\'|"([a-zA-Z0-9\+\/]*("\s*\.\s*")?[a-zA-Z0-9\+\/]*)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/

次の部分一致を検索します。

"BASE64+ENCODED+VIRUS+HERE"));

しかし、このファイル全体に一致を適用しようとすると: http://pastebin.com/ED8sFUP0ブラウザのメッセージ「ページの読み込み中にサーバーへの接続がリセットされました。」でページが停止します。

エラー報告を有効にしています:

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('scream.enabled', TRUE);

しかし、ここにもApacheのエラーログにも何も表示されません。

問題のある文字列を含まないファイルで使用された場合、まったく同じ正規表現が期待どおりに機能します。preg_match は boolean false を返しません。0 を返します。これは、正規表現エラーがなく、一致が見つからなかったことを意味します。

私の懸念は、正規表現が部分的な一致しか見つけられない理由であるとは限りません。それはおそらく私が作ったタイプミスで、たまたまうまくいきました。

正規表現コンパイラがいつ、どのようにプロセス チェーン全体を壊してしまうのか知りたい

apache > php > regex_compiler

私の正規表現がたまたま正しくコンパイルされたが、正しく一致しなかったことが「原因」である可能性が非常に高いことを理解しています。そして、それは将来的に何か悪いことを引き起こす可能性があります。しかし、私の興味は、正規表現コンパイラがエラーなしで失敗する理由と、生成されるはずのエラー メッセージを取得する方法です。

同様のことが議論されていますが、ここでは解決されていません: php preg_match_all kills page for unknown reason

4

2 に答える 2

1

編集:

 \s*
 eval \s*
 \( \s*
    base64_decode \s* 
    \( \s* 
        (?:
            (?>
               '
                 [a-zA-Z0-9+/]*
                 (?:
                    '
                      \s* \. \s*
                    '
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               '
            )
          |
            (?>
               "
                 [a-zA-Z0-9+/]*
                 (?:
                    "
                      \s* \. \s*
                    "
                    [a-zA-Z0-9+/]*
                 )*
                 ={0,2}
               "
            )
        )
        \s*

    \)\s*

 \)\s* ;? \s*

"".'' カテネーションの処理方法

言語を解析しようとしない (これでそれを行うことができなかった) ため 、この非常に高速な正規表現で
カテネーション条件を処理できます..."".''

~
 \s*
 eval \s*
 \( \s*
    base64_decode
    \s* 
    \(
       \s* 
        ["']
        (?> [a-zA-Z0-9+/]* (?: ["']\s*\.\s*["'] [a-zA-Z0-9+/]* )* )
        ={0,2}
        ["']
       \s*
    \)
    \s*
 \)
 \s* ;? \s*

~x
于 2012-05-17T21:57:57.233 に答える
0

あなたの正規表現には、 ==> Catastrophic Backtrackingと一致する多くの可能性があると思います。

/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*)*={0,2}\'|"([a-zA-Z0-9\+\/]*("\s*\.\s*")?[a-zA-Z0-9\+\/]*)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

正規表現は、私がマークした部分に一致させるために多くの手順を必要とします==> パフォーマンスの問題があります。正規表現は時間内に終了しません!

オプションであるため、正規表現がオプション部分の前と後の同じものと(\'\s*\.\s*\')?何を一致させるかを理解するまで、多くの手順が必要です。[a-zA-Z0-9\+\/]*

できることは、所有量指定子を使用することです(量指定子の後に a を追加して所有格+にします)。それらはバックトラックを防ぎ、所有量指定子は一致した文字を返しません。だから、これを試してください

/\s*eval\s*\(\s*base64_decode\s*\(\s*\'([a-zA-Z0-9\+\/]*+(\'\s*\.\s*\')?[a-zA-Z0-9\+\/]*+)*={0,2}\'|"([a-zA-Z0-9\+\/]*+("\s*\.\s*")?[a-zA-Z0-9\+\/]*+)*={0,2}"\s*\)\s*\s*\)\s*(;)?\s*/
                                                       ^^                               ^^                           ^^                            ^^
于 2012-05-17T21:45:18.160 に答える