
我有以下規則將所有帶有可疑附件的電子郵件發送到專用資料夾:
# Emails with attachments
:0
* ^Content-Type: multipart/
{
:0 B
* ^Content-Type: application/(zip|x-zip-compressed)|\
^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*attachment.*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*application.octet-stream.*name=.*\.(zip|exe|rar|rtf|docm)
$L/.3_my._quarantine/
}
然而我剛剛注意到一封帶有 zip 附件的電子郵件從其中滑過,我不明白為什麼(my@email 和 myemail 包含我的電子郵件和我混淆的主機):
X-Priority: 3 (Normal)
From: [email protected]
To: "[email protected]"
<[email protected]>
Subject: Attached File
Date:Mon, 16 May 2016 17:16:47 +0530
Message-Id: <272843899191709486.0001.scannerTxNo.0051@scannerF04EF6.myemail.com>
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="53594271E1EBE7BBDAF4BBA9"
--53594271E1EBE7BBDAF4BBA9
Content-Type: application/x-compressed;
name="[email protected]_3602848_97891076672132.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="[email protected]_3602848_97891076672132.zip"
AFAICS^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)
應該匹配嗎?是因為引號嗎?
答案1
您連結到的帖子確實表明已折疊標頭處理正確,但是這個配方正在檢查正文,而不是標題。
Procmail 的一個缺陷是它不能正確辨識 MIME 結構;這將是對現代郵件過濾器的重要補充;但可惜的是,Procmail 的開發早在 2000 年代初期就已經停止了(在此之前已經停止過一次,當時原始開發人員已經放棄了)。
作為一種粗略的解決方法,您可以在MIME 邊界上臨時拆分MIME 多部分訊息,並將每個部分提供給單獨的Procmail 配方,但這很快就會變得脆弱且複雜(理論上,MIME訊息可以任意深度嵌套,儘管對於大多數人來說)出於實際目的,您只需要向下遞歸一到兩個級別——超出這一級別的任何內容都可能是反彈或類似的東西,而不是您正在檢查的訊息的直接特徵)。
因為您的正規表示式只有幾個可能的(現實的!)分割點,所以您可以重構它以考慮可能的換行符:
:0
* ^Content-type: multipart/
{
:0B
* ^Content-Type: application/(zip|x-zip-compressed)|\
^Content-Type:.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*attachment.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*application.octet-stream.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
$L/.3_my._quarantine/
}
您會注意到(($)[ ].*)*
在一些地方添加了內容。這解釋了可能的換行符 ( ($)
) 後面跟著一個空白字元(製表符或空格,[ ]
),後面跟著任何內容,重複零次或多次。
(順便說一句,透過評分進行調試可能會稍微容易一些:
:0 B
* 1^1 ^Content-Type: application/(zip|x-zip-compressed)
* 1^1 ^Content-Type:.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
* 1^1 ^Content-.*attachment.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
* 1^1 ^Content-.*application.octet-stream.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
...
這樣,您可以在日誌中看到VERBOSE=yes
這個複雜的多正規表示式配方中每個單獨正規表示式的結果。
如果您需要一個完全無懈可擊的配方,也許可以用 Python 或 Perl(或 Ruby 或…您有什麼)編寫一個簡單的腳本來標準化 MIME 結構。我記得很久以前有一個工具emil
可以做類似的事情,但它從來都不是很完善,更不用說有詳細的文檔記錄了。 (事實上, IIRC 是專門為插入 pre-MIME 而設計的sendmail
,幾乎不可能用於其他任何用途。)