最近、職場でメール本文にマルウェアと思われるコンテンツを含むメールが届き始めました。次のように、正規表現を使用して長い文字列にリストされている単語以外の文字のみを一致させるprocmailレシピを作成しようとしています。
/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afe0:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Jenny:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#preston:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afectarac:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#FORTHCO:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#backgrounds:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#legumes
スペースがないことに注意してください。これは小さな例です。一部のメールの行の長さは20,000文字を超えています。これにより、スパムフィルタリングがめちゃくちゃになり、スペース区切りなしで単語ではなく文字の長い行を一致させる方法があることを願っています。これまで、以下のいくつかのバリエーション/彫刻/組み合わせを試みましたが、部分的な成功だけを収めました。多くの偽の肯定を捉えずにこれを行う方法を見つけるのに苦労しています。
:0
* B ?? ^.*(!@#$%^&*()[]{})+ && ! </([a-z|A-Z])/>
$DEFAULT/MalSpam/
私は一致する正規表現を作成し、1行あたりの総文字数が特定の数(500など)を超える場合は、別の電子メールで送信するために他のルールと組み合わせることができると思いました。まだこの部分を把握していません...過去に私が使用した他の正規表現には、単語ではなく文字にのみ一致する\ Wフラグがありました。 procmailに該当するものはありますか?どうすればいいですか?
答え1
最後の質問については\W
必要ありません。逆の操作を実行できます\w
。たとえば、これが単語文字[a-zA-Z0-9_]
(例えば、Vimの定義\w
)であると思われる場合を使用します[^a-zA-Z0-9_]
。
答え2
あなたが試した表面的な修正は次のとおりです。
:0
* B ?? [][!@#$%^&*(){}]+
* ! B ?? </[a-zA-Z]+/>
$DEFAULT/MalSpam/
</
私が正しく推測した場合、あなたは2つ以上の句読点文字シーケンスを一致させようとし、否定的な条件でアルファベット文字シーケンスと一致しようとします/>
(一致するものがあればレシピが一致しないことを意味します)。
しかし、2つの句読点文字(たとえば!!
)は、最初の正規表現と一致します。なぜ2番目の条件を入力したのかわかりません。
1つの課題は、多くの文章文字が正規表現メタ文字であることです。リテラル[
または(
を一致させるには、*
バックスラッシュでエスケープするか、文字クラスに入れる必要があります。 (埋め込まれ[
た文字クラスは理解するのに時間がかかります。文字クラス角かっこ内のリテラル[[]
です....そしてそれを含めて含める必要がある文字クラスは順番に含まれます。)最初の正規表現を単純化しました。配置して[
[
]
]
[
[][]
すべて文字クラスでは、実際には広すぎる可能性があります。たとえば、4から5の順序を順番に要求できます。 (残念ながら、Procmailの正規表現バリアントはegrep
数量子[class]{5,}
をサポートしていません。ここでは役に立ちます。)
:0B
* [][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}]
* ! </[a-zA-Z]+/>
$DEFAULT/MalSpam/
詳しく見ると、最初のものが[][!@#$%^&*(){}]
5回繰り返されることがわかります。もっと長くしたい場合(たとえば、500の隣接する項目)、必要なだけ繰り返すことができます。完全な式が次より長い場合でも、この点に注意してくださいLINEBUF
。 7文字の正規表現を500回使用できるスペースを確保するには10,200バイトなので、LINEBUF
少なくとも大きいサイズであることを確認する必要があります。これは長い表現を含むレシピBeforeです。
B
さらに、レシピのフラグを使用すると、B ??
個々のレシピラインにフラグを配置する必要がなくなります。
メッセージの長さを比較するには、>
必要な数字とを使用してください。:0B
フラグがある場合は* > 512
一致します。体長さが512バイトを超えています。
最後の質問では、デフォルトでは文字クラス(範囲や範囲、または範囲にない単一文字)\W
と同じです。[^A-Za-z0-9_]
A-Z
a-z
0-9
_