不需要的電子郵件的六種消除方法
發(fā)布時間:2006/9/27 13:47:23 來源: 縱橫數(shù)據(jù)
多年來不請自來的電子郵件問題日漸嚴重地困擾著人們,但現(xiàn)在有了解決這一問題的辦法。在本文中,David 討論并比較了幾種主要的方法來自動消除不需要的電子郵件,同時,還介紹和測試了一些采用這些方法的流行的工具。
不道德的電子郵件發(fā)送者可以不費多大成本或根本不費成本地分發(fā)大量消息,而正常用戶卻被迫花費一些時間和精力從他們的郵箱中清除這些欺詐性的或不需要的郵件。在本文中,我描述了幾種方法,這些方法用計算機代碼來幫助消除不請自來的商業(yè)性電子郵件、病毒、特洛伊木馬和蠕蟲病毒以及懷有惡意的欺詐性電子郵件與其它一些不希望收到的和令人煩惱的電子郵件。在某種意義上,消除垃圾郵件最好的終極解決方案可能是通過立法來制止這種行為。然而,在此期間,即在法律的進步(如果有過的話)還未解決公眾不斷所受到的困擾之前,可以用代碼開發(fā)一些工具作為過渡性的解決方案來處理這類問題。
從技術(shù)角度考慮 — 但也是常識 — 我們所說的“垃圾郵件”的含義通常比“不請自來的商業(yè)性電子郵件”的范疇要廣;垃圾郵件包含了所有我們不需要的以及沒有明確表明要發(fā)送給我們的電子郵件。這樣的消息其本身并不總是具有商業(yè)性,而對于有些消息,很難說是我們所需要的。例如,我們不想感染上病毒(即使來自不謹慎的朋友);通常也不想收到連鎖電子郵件(chain letter),即使這些郵件不是來要錢的;既不想收到來自陌生人的誘勸性的消息;也不想收到完全是欺騙性的郵件。在任何一種情況中,都能很清楚地確定郵件是否為垃圾郵件,許許多多人都曾收到過這樣的郵件。
垃圾郵件的問題是,它會將正常的電子郵件淹沒。以我的經(jīng)歷為例,幾年前,我偶爾會收到了一封不請自來的消息,大概每天有一封或兩封。與此相對照,在這個月中的每一天,我所收到垃圾郵件的數(shù)目是合法郵件的很多倍。平均大概每收到 1 封正常的郵件就會得到 10 封垃圾郵件。從某些方面講,我與一般人不同 — 作為一名公眾撰稿人,我的電子郵件地址是公布給大家的;而且,我歡迎那些未曾謀面之人就我所發(fā)表的文章以及我的軟件庫給我發(fā)電子郵件,并且也確實經(jīng)常收到這方面的電子郵件。遺憾的是,來自陌生人的電子郵件 — 誰也不知道這些郵件使用的是什么電子郵件應(yīng)用程序、哪種 OS 以及本地自然語言等 — 不會馬上明顯地顯示出它的目的;垃圾郵件發(fā)送者設(shè)法在這種含糊狀態(tài)之下來發(fā)送他們的消息。對我來講,我的時間是寶貴的,特別是每時每刻都有許多工作要做。
隱藏聯(lián)系人信息
對于一些電子郵件用戶,避免垃圾郵件的非常簡單且合理的方法(而且這種方法也足夠應(yīng)付這個問題)是,只要牢牢地保護好電子郵件地址,不泄漏出去。對于這些人,只將電子郵件地址告訴給那些經(jīng)過挑選的、可信的對方。另外需要注意的是,挑選電子郵件地址時,避免選用那些容易被猜出的名字以及選用字典里的單詞,在將地址張貼到公共場合時,可以偽裝地址,我們都見過巧妙地編碼成以下形式的電子郵件地址:“”或“echo zregm@tabfvf.pk | tr A-Za-z N-ZA-Mn-za-m”。
除了隱藏地址之外,隱蔽的電子郵件使用者還常常使用一個或多個免費的電子郵件服務(wù),他們將這些地址作為“用完即棄”的地址。如果自己對對方半信半疑但需要與之進行電子郵件通信,則可以將一個臨時的電子郵件地址用上幾天,然后,只要有垃圾郵件出現(xiàn)(自此之后,可能會有垃圾郵件源源不斷地發(fā)送到此地址),就廢棄這個地址。要保護好“只有心腹知己 ”才能知道的真正地址。
我做過一次非正式的調(diào)查,在 Web 公告板(Web-board)、郵件列表、Usenet 等上討論了垃圾郵件問題,我發(fā)現(xiàn),有了這些基本的預(yù)防性措施,就足以保護這類電子郵件用戶。
然而,對于我 — 以及對于其他許多人 — 這些方法根本不可能完全避免垃圾郵件。我有一個公開的電子郵件地址,出于許多理由,我必須公開這個地址。在我能控制的范圍內(nèi),確實利用了多個地址來檢測“漏網(wǎng)”垃圾郵件的來源;但不幸的事實是,大多數(shù)垃圾郵件發(fā)送者可以用與合法郵件發(fā)送者相同的方法獲取到我的電子郵件地址:象這篇文章一樣,從文章的頂部獲得地址列表,以及其它有關(guān)我地址方面的公開信息。
過濾軟件一瞥
本文從特定的角度來研究過濾軟件。對于正確識別垃圾郵件和合法消息這方面,我想了解這些不同的方法做得如何。為了回答這個問題,我沒有將注意力特別放在配置過濾器應(yīng)用程序,使之能使用各種“郵件傳送代理(Mail Transfer Agents (MTA))”的細節(jié)上。在 MTA(譬如,Sendmail、QMail、Procmail、Fetchmail 以及其它郵件程序)的最佳配置方面,確實存在著許多奧妙。而且,許多電子郵件客戶機都有自己的過濾選項和插件 API。幸運的是,我研究的大多數(shù)過濾器都帶有相當出色的文檔,里面講述了如何配置它們以與各種 MTA 協(xié)同工作。
為了測試,我開發(fā)了兩組消息集:垃圾郵件和合法郵件。實際上這是我從前幾個月收到的郵件中抽取出的兩組消息,但我又向其中添加了一個重要的消息子集,在這些消息中,有的來自幾年前,這就擴大了測試范圍。我不能確切地知道,在下個月的電子郵件中會包含什么,但過去的郵件已為以后的趨勢提供了極好的線索。這聽上去似乎很神秘,但我的意思是,我不希望把這些模式只限制于一些單詞、短語和正則表達式等,這些也許能描述出最近電子郵件的特征,但卻不能概括成這兩種類型。
除了這兩組電子郵件,我為那些工具開發(fā)了培訓(xùn)(training)消息集,以“了解”什么是垃圾郵件,什么不是垃圾郵件消息。這些培訓(xùn)消息集比較大,而且有一部分是與測試集不相交的。測試集中包含略少于 2000 條的垃圾郵件消息,合法消息的數(shù)目與此大致相同。而培訓(xùn)集中的消息是它們的兩倍。
關(guān)于測試,這里有必要強調(diào)一下一般性的注意事項。在垃圾郵件過濾器中的“誤否認”(False negatives)僅意味著一些不需要的消息進入了郵箱。這不是一件好事,但其本身沒有多可怕!罢`承認”(False positive)是指合法消息被誤判為垃圾郵件。這可能非常糟糕,因為一些合法郵件實際上很重要,甚至非常緊急,有時盡管這些消息是一些聊天性質(zhì)的郵件,但我們也不希望丟失它們。大多數(shù)過濾軟件能讓您將受拒的消息保存在臨時文件夾中,等待您去查看 — 但如果需要查看的文件夾中充斥著大量的垃圾郵件,那么這個軟件的實用性會因此而削弱。
1. 基本的結(jié)構(gòu)化文本過濾器
我所使用的電子郵件客戶機能夠根據(jù)特定郵件頭域、一般性郵件頭和/或正文中的簡單字符串來對到來的電子郵件進行排序。這個功能非常簡單,甚至不包含正則表達式匹配。幾乎所有的電子郵件客戶機都有這樣的過濾能力。
在過去幾個月中,我開發(fā)了少量的文本過濾器。這些少量的簡單過濾器能正確捕獲我所收到垃圾郵件中的 80%。遺憾的是,這些過濾器的“誤承認”的發(fā)生率比較高 — 以至于我不時地需要手工來檢查垃圾郵件文件夾中的某些郵件。(我將可能的垃圾郵件進行分類,放在幾個不同的文件夾中,然后保存它們以形成消息語言資料庫(corpora)。)雖然各個用戶之間具體的細節(jié)會有所不同,但對大多數(shù)讀者來講,這個通用的模式是很有用的:
集合 1:一些人或郵件列表在他們的郵件頭上做了一些有趣的手腳,使得它們與眾不同。我捕獲郵件頭中的某些內(nèi)容(通常是 From:),并將其放在“白名單(whitelist)”中(“收件箱”或其它文件夾)。
集合 2:我執(zhí)行以下垃圾郵件過濾器(沒有按特定的順序):
識別特定的惡意郵件發(fā)送者。
查找作為 From: 郵件頭的“<>”。
查找郵件頭中的“@<”(出于許多原因,許多垃圾郵件都有這個標記)。
查找“Content-Type: audio”。我不需要這個,只有 virii 病毒需要(具體情況因人而異)。
在郵件頭中查找“euc-kr”和“ks_c_5601-1987”,我不懂這種語言,但出于某些原因,我收到了大量韓國垃圾郵件(當然,對于真正的韓國讀者,這條規(guī)則恐怕不太適合他)。
集合 3:存儲那些已知是合法地址的消息。我有幾條這樣的規(guī)則,但它們都僅僅與文字 To: 域相匹配。
集合 4:查找那些在郵件頭中具有合法地址,但通過上一個 To: 過濾器沒有捕獲到的消息。我發(fā)現(xiàn),只要我的郵件地址出現(xiàn)在 Bcc: 域,其中有一串按字母順序排列的地址(譬如,mertz1@……、mertz37@……等)時,那這封郵件肯定是不請自來的郵件。
集合 5:到此,所剩下的可能就是垃圾郵件(它可能有偽造的郵件頭以避免被識別出發(fā)送者的身份)。
2.“白名單”/驗證過濾器
對于垃圾郵件的過濾,有一種主動性相當強的技術(shù),我想稱之為“白名單加自動驗證”方法。這里有幾種工具可以實現(xiàn)帶驗證的“白名單”:TDMA 是一個深受大家喜愛的多平臺開放源碼工具;ChoiceMail 是一個針對 Windows 的商業(yè)性工具;其它大多數(shù)似乎都比較初級。(請參閱本文后面的參考資料,那里有一些鏈接。)
“白名單”過濾器連接到 MTA,只有當接收者顯式地同意接收,才會將郵件傳到收件箱。其它消息會產(chǎn)生一個特殊的質(zhì)詢(challenge)響應(yīng)給發(fā)送者。“白名單”過濾器的響應(yīng)包含某種唯一的可以識別原始消息的代碼,譬如,一個散列或序列標識。這個質(zhì)詢消息包含讓發(fā)送者答復(fù)的指示,以便將其加到“白名單”中(這個響應(yīng)消息必須包含由“白名單”過濾器生成的代碼)。幾乎所有的垃圾郵件信息中的回復(fù)地址信息都是偽造的,所以這個質(zhì)詢通常沒有人會收到;但即便那些垃圾郵件發(fā)送者提供了有用的回復(fù)地址,但他們往往不會響應(yīng)這個質(zhì)詢。當合法的發(fā)送者答復(fù)了這個質(zhì)詢之后,會將她/他的地址添加到“白名單”中,以便將來來自同一地址的消息會自動地通過檢查。
雖然我沒有用過這些工具,而只是自己做了些實驗,但我認為,“白名單”/驗證過濾器幾乎可以 100% 地將垃圾郵件消息阻擋在外面。可以想象,垃圾郵件發(fā)送者會開始在他們的系統(tǒng)中加一個質(zhì)詢響應(yīng),但只要稍微使質(zhì)詢消息變得復(fù)雜些,就可以解決這個問題(例如,要求對代碼做一點小小的人為改動)。而且,如果垃圾郵件發(fā)送者響應(yīng)了質(zhì)詢,那么就會使那些尋求合法地抵御垃圾郵件的人們可以更容易地跟蹤到他們。
“白名單”/驗證過濾器這種做法給合法的發(fā)送者帶來了額外的負擔。由于有些通信者可能出于各種原因而無法響應(yīng)質(zhì)詢,所以會帶來“誤承認”這種情況。在最好的情形下,合法發(fā)送者只需花費一點點精力即可。但在以下情況,發(fā)送者可能無法發(fā)送他們合法的消息:發(fā)送者具有不可靠的 ISP,防火墻的要求過于嚴格,發(fā)送者具有多個電子郵件地址,不能夠理解英語(或者質(zhì)詢所使用的語言),或者發(fā)送者只是忽略了質(zhì)詢以及不想被質(zhì)詢所干擾。而且,有時合法的“通信者”根本不是人,而是不能夠響應(yīng)質(zhì)詢的自動響應(yīng)系統(tǒng)!鞍酌麊巍保炞C過濾器可能需要額外花精力來處理郵件列表注冊、在線購買、網(wǎng)站注冊以及其它“自動通信”。
3. 分布式適應(yīng)性黑名單
垃圾郵件往往被定義為發(fā)送給大量接收方的郵件。實際上,幾乎很少有垃圾郵件被定制為發(fā)送給個別接收方。然而,在缺少預(yù)先過濾的情況下,每個垃圾郵件的接收者必須按自己的“Delete”按鈕來刪除垃圾消息。分布式黑名單過濾器會讓一個用戶的“Delete”操作去警告其他許多用戶,注意這個垃圾郵件消息。
象 Razor 和 Pyzor(請參閱參考資料)這樣的工具運行在服務(wù)器一端,服務(wù)器上存儲了一些已知垃圾郵件的摘要。當 MTA 收到一條消息時,會調(diào)用分布式黑名單過濾器來確定這條消息是否是已知的垃圾郵件。這些工具運用一些智能化的統(tǒng)計技術(shù)來創(chuàng)建摘要,使得在垃圾郵件作了微小的變動或自動的變化(或僅僅是由于傳輸路由的變化而導(dǎo)致郵件頭的更改)時,也不會防止識別消息的身份。此外,分布式黑名單服務(wù)器的維護者經(jīng)常會專門創(chuàng)建一些“蜜罐”地址,以引誘垃圾郵件(但從不針對合法的通信)。在我的測試中,發(fā)現(xiàn)用 Pyzor,從沒有出現(xiàn)“誤承認”這類情況。我認為用其它類似的工具(如 Razor)也不會出現(xiàn)這樣的情況。
對此有些常識。即使那些有不良企圖的發(fā)送者可以篡改合法消息,他們也不可能讓我的好消息樣本向服務(wù)器報告 — 通常只有垃圾郵件是廣泛分發(fā)的?梢韵胂,被大量發(fā)送但又是合法的消息(譬如,developerWorks 時事通訊)可能會導(dǎo)致錯誤報告,但分布式黑名單服務(wù)器的維護者幾乎肯定會檢測到這一點,并快速地糾正這樣的問題。
然而,正如由下面的匯總表所顯示,使用分布式黑名單時發(fā)生“誤否認”的頻率要比其它我所測試的技術(shù)多很多。Pyzor 的作者推薦將這個工具與其它技術(shù)相結(jié)合使用,而不是作為單獨的防線來抵御垃圾郵件。雖然,這似乎合乎情理,但對于識別郵件是否為垃圾郵件這一點,事實上還不清楚這樣的組合過濾技術(shù)是否比單獨使用那些技術(shù)要強。
此外,由于分布式黑名單需要與服務(wù)器進行對話以執(zhí)行驗證,所以,在對我的語言資料庫做測試時,Pyzor 的執(zhí)行效率要比其它技術(shù)慢得多。對于測試小流量的消息,這不是大問題,但對于高容量的 ISP,這可能是個問題。我還發(fā)現(xiàn),每一千條查詢中,總會出現(xiàn)幾次網(wǎng)絡(luò)超時,所以,我的結(jié)果有一些“錯誤”(error),而不是標出“spam”(垃圾郵件)或“good”(合法郵件)。
4. 基于規(guī)則的評定
在基于規(guī)則的垃圾郵件過濾技術(shù)方面,SpamAssassin 是最受大家喜愛的工具,它處于遙遙領(lǐng)先的地位。還有其它一些工具,但它們要么沒有得到廣泛地使用,要么沒有得到積極的維護。對要識別的消息,SpamAssassin(及其它類似工具)評估了大量的模式 — 大多數(shù)是正則表達式。如果有匹配的模式,則增加消息分數(shù),否則,則減少消息分數(shù)。如果消息分數(shù)超過某一特定的閾值,則將其視為垃圾郵件而過濾它;否則認為是合法。
一些評定規(guī)則基本上穩(wěn)定不變 — 例如,偽造的頭和自動執(zhí)行的 JavaScript,幾乎總是垃圾郵件的標志。因為垃圾郵件發(fā)送者所開發(fā)出的產(chǎn)品和詭計在不斷變化,所以需要更新其它一些規(guī)則。今天的垃圾消息中,偉哥和非洲獨裁者的后繼者們也許還風(fēng)行一時,但明天一些新品種的蛇油藥品或色情作品可能會將擠占它們的位置。隨著垃圾郵件的發(fā)展,SpamAssassin 也必須發(fā)展,以跟上它們的步伐。
SpamAssassin 的自述文件中有下列非常有力的聲明:
在最近的測試中,SpamAssassin 區(qū)分垃圾郵件和非垃圾郵件的正確率達到了 99.94%。以后,SpamAssassin 一直會做得越來越好!
我的測試顯示,它沒有達到這個水平。根據(jù)我的語言資料庫,SpamAssassin 大約會發(fā)生 0.3%“誤承認”和 19%“誤否認”的情況(這一比率非常高)。公平而論,這只是評估基于規(guī)則的過濾器,而沒有針對分布式黑名單做選擇性的檢查。此外,我的垃圾郵件語言資料庫中不都是純的垃圾郵件 — 它還包括大量可能是病毒的附件(我沒有打開這些附件做確認,但我知道它們不是我認可的消息)。SpamAssassin 的 FAQ 對查找病毒作了免責(zé)聲明;而另一方面,在查找病毒方面,以下技術(shù)做得更好,所以,這份免責(zé)聲明并不是那么引人注目。
在速度方面,SpamAssassin 比分布式黑名單運行得更快,因為分布式黑名單需要查詢網(wǎng)絡(luò)服務(wù)器。但它的速度還是遠低于下面統(tǒng)計模型(使用本機數(shù)據(jù)結(jié)構(gòu),用解釋型的 Python 編寫的)的非優(yōu)化版本。有關(guān) SpamAssassin 的優(yōu)缺點,請閱讀“用 SpamAssassin 消滅垃圾郵件”(developerWorks,2002 年 9 月)。
5. 貝葉斯(Bayesian)單詞分布過濾
Paul Graham 于 2002 年 8 月寫了一篇極具爭議的文章。在“A Plan for Spam”(請參閱本文后面的參考資料)中,Graham 提議建立垃圾郵件和非垃圾郵件單詞的貝葉斯概率模型。Graham 的文章或者其它任何有關(guān)統(tǒng)計和概率的一般性文章都詳細講述了數(shù)學(xué)方面的背景知識,比我在這里講得更透徹。
其大體思想是,在已知的垃圾郵件中,一些單詞出現(xiàn)的頻率較高,而在合法消息中,另一些單詞出現(xiàn)的頻率較高。運用一些眾所周知的數(shù)學(xué)知識,對于每個單詞,可以生成一個“垃圾郵件指示性概率”。根據(jù)消息中所包含的一組詞,可以用另一個簡單的數(shù)學(xué)公式來確定文本消息的整體“垃圾郵件概率”。
Graham 的想法有以下幾個值得注意的好處:
可以從已分類消息的語言資料庫中自動生成過濾器,而不需要人花費精力來制訂規(guī)則。
可以根據(jù)個別用戶特有的垃圾郵件和合法消息來進行定制。
可以通過少數(shù)幾行代碼來實現(xiàn)這個想法。
運行情況出奇得好。
乍一看,似乎這樣的猜想合乎情理:即,象 SpamAssassin 這樣用手工調(diào)整和耗費大量人力開發(fā)的規(guī)則要比漫無目的的自動方法更能準確地的預(yù)測出垃圾郵件。事實說明這種猜想完全錯誤;旧希y(tǒng)計模型僅比基于規(guī)則的方法要好。附帶的好處是,Graham 樣式的貝葉斯過濾器還是比 SpamAssassin 更快和更簡單。
在 Graham 的文章發(fā)表的這些天里 — 也許就在數(shù)小時里,許多人同時開始實現(xiàn)這個系統(tǒng)。我出于測試目的,使用了由我的通信者 John Barham 所創(chuàng)建的 Python 實現(xiàn)。我感謝他給我提供了這個實現(xiàn)。不過,由于數(shù)學(xué)原理是如此之簡單,以至于每個其它的實現(xiàn)大都相同。
有一些數(shù)據(jù)結(jié)構(gòu)和存儲技術(shù)的問題會影響到各種工具的運行速度。但事實上預(yù)測的精確性取決于很少幾個因素 — 最關(guān)鍵因素可能是所使用的詞法技術(shù),這些因素大都用來消除虛假的隨機字符串。Barham 的實現(xiàn)僅在一個小的集合中(字母數(shù)字加一些其它字符)查看相對較短和不相交(disjoint)的字符序列。
6. 貝葉斯三元模型(trigram)過濾器
貝葉斯技術(shù)建立在單詞模型上,其工作良好。這種單詞模型的缺點之一是,電子郵件中采用的“單詞”的數(shù)量實際上是無限制的。這個事實可能與我們的直覺相反 — 認為一旦全部包括了幾乎所有的英文單詞,您就可以一勞永逸,這似乎很合乎情理。從我以前對全文本索引的研究了解到,這完全是不現(xiàn)實的;“與單詞類似的”字符序列的數(shù)量可能是接近無限,新的文本會不斷地產(chǎn)生新的序列。對電子郵件來說,尤其是這樣,電子郵件包括消息標識、內(nèi)容分隔符、UU 和 base64 編碼等等任意的字符串。從模型中丟棄單詞有多種方式(最簡單的方式是只丟棄出現(xiàn)頻率非常稀少的單詞)。
我決定研究一下,對于貝葉斯垃圾郵件過濾器,一個絕對有限的模型空間究竟工作得有多好。我明確地決定,我的概率模型使用三元模型,而不是“單詞”。當然,這個想法不是憑空而來的;對于語言識別/區(qū)分、英語的密碼唯一長度、模式頻率和相關(guān)領(lǐng)域所進行的大量研究極力推薦將三元模型作為一個良好的單元。
沿著這條思路,我做了幾個決定。其中最重要的選擇是確定三元模型是什么。雖然這比識別一個“單詞”要稍微簡單些,但這完全是一種幼稚的方法 — 查找三字節(jié)的每個(重疊)序列的方法不是最優(yōu)化的。尤其考慮到高位字符 — 雖然在多字節(jié)字符集(換句話說,CJK)出現(xiàn)的頻率相對較高 — 會使三元模型的空間比只在 ASCII 范圍中查找要大得多。進一步將三元模型空間限制在低位字符會產(chǎn)生較小的空間,但整體結(jié)果不是很好。
對于我的三元模型分析,我只利用了高差分三元模型作為消息分類器。但我只是用試錯法(trial and error)才達到了“垃圾郵件”和“合法”三元模型所選定的數(shù)目。對垃圾郵件,我還用了臨界概率,而不是任意概率:我發(fā)現(xiàn)了一個有趣的現(xiàn)象,“合法”語言資料庫中沒有一條消息的垃圾郵件概率是超過 .0071 的,而在 .99 概率范圍內(nèi),只有兩個“誤承認”的情況。然而,將臨界概率從最初的 0.9 降到 0.1,可以使我在“垃圾郵件”語言資料庫中捕獲更多的消息。出于速度方面的考慮,從每個候選消息中挑出不多于 100 個“令人感興趣”的三元模型 — 改變這個數(shù)目,結(jié)果可能略微會有所變化(但不是很明顯)。
不道德的電子郵件發(fā)送者可以不費多大成本或根本不費成本地分發(fā)大量消息,而正常用戶卻被迫花費一些時間和精力從他們的郵箱中清除這些欺詐性的或不需要的郵件。在本文中,我描述了幾種方法,這些方法用計算機代碼來幫助消除不請自來的商業(yè)性電子郵件、病毒、特洛伊木馬和蠕蟲病毒以及懷有惡意的欺詐性電子郵件與其它一些不希望收到的和令人煩惱的電子郵件。在某種意義上,消除垃圾郵件最好的終極解決方案可能是通過立法來制止這種行為。然而,在此期間,即在法律的進步(如果有過的話)還未解決公眾不斷所受到的困擾之前,可以用代碼開發(fā)一些工具作為過渡性的解決方案來處理這類問題。
從技術(shù)角度考慮 — 但也是常識 — 我們所說的“垃圾郵件”的含義通常比“不請自來的商業(yè)性電子郵件”的范疇要廣;垃圾郵件包含了所有我們不需要的以及沒有明確表明要發(fā)送給我們的電子郵件。這樣的消息其本身并不總是具有商業(yè)性,而對于有些消息,很難說是我們所需要的。例如,我們不想感染上病毒(即使來自不謹慎的朋友);通常也不想收到連鎖電子郵件(chain letter),即使這些郵件不是來要錢的;既不想收到來自陌生人的誘勸性的消息;也不想收到完全是欺騙性的郵件。在任何一種情況中,都能很清楚地確定郵件是否為垃圾郵件,許許多多人都曾收到過這樣的郵件。
垃圾郵件的問題是,它會將正常的電子郵件淹沒。以我的經(jīng)歷為例,幾年前,我偶爾會收到了一封不請自來的消息,大概每天有一封或兩封。與此相對照,在這個月中的每一天,我所收到垃圾郵件的數(shù)目是合法郵件的很多倍。平均大概每收到 1 封正常的郵件就會得到 10 封垃圾郵件。從某些方面講,我與一般人不同 — 作為一名公眾撰稿人,我的電子郵件地址是公布給大家的;而且,我歡迎那些未曾謀面之人就我所發(fā)表的文章以及我的軟件庫給我發(fā)電子郵件,并且也確實經(jīng)常收到這方面的電子郵件。遺憾的是,來自陌生人的電子郵件 — 誰也不知道這些郵件使用的是什么電子郵件應(yīng)用程序、哪種 OS 以及本地自然語言等 — 不會馬上明顯地顯示出它的目的;垃圾郵件發(fā)送者設(shè)法在這種含糊狀態(tài)之下來發(fā)送他們的消息。對我來講,我的時間是寶貴的,特別是每時每刻都有許多工作要做。
隱藏聯(lián)系人信息
對于一些電子郵件用戶,避免垃圾郵件的非常簡單且合理的方法(而且這種方法也足夠應(yīng)付這個問題)是,只要牢牢地保護好電子郵件地址,不泄漏出去。對于這些人,只將電子郵件地址告訴給那些經(jīng)過挑選的、可信的對方。另外需要注意的是,挑選電子郵件地址時,避免選用那些容易被猜出的名字以及選用字典里的單詞,在將地址張貼到公共場合時,可以偽裝地址,我們都見過巧妙地編碼成以下形式的電子郵件地址:“”或“echo zregm@tabfvf.pk | tr A-Za-z N-ZA-Mn-za-m”。
除了隱藏地址之外,隱蔽的電子郵件使用者還常常使用一個或多個免費的電子郵件服務(wù),他們將這些地址作為“用完即棄”的地址。如果自己對對方半信半疑但需要與之進行電子郵件通信,則可以將一個臨時的電子郵件地址用上幾天,然后,只要有垃圾郵件出現(xiàn)(自此之后,可能會有垃圾郵件源源不斷地發(fā)送到此地址),就廢棄這個地址。要保護好“只有心腹知己 ”才能知道的真正地址。
我做過一次非正式的調(diào)查,在 Web 公告板(Web-board)、郵件列表、Usenet 等上討論了垃圾郵件問題,我發(fā)現(xiàn),有了這些基本的預(yù)防性措施,就足以保護這類電子郵件用戶。
然而,對于我 — 以及對于其他許多人 — 這些方法根本不可能完全避免垃圾郵件。我有一個公開的電子郵件地址,出于許多理由,我必須公開這個地址。在我能控制的范圍內(nèi),確實利用了多個地址來檢測“漏網(wǎng)”垃圾郵件的來源;但不幸的事實是,大多數(shù)垃圾郵件發(fā)送者可以用與合法郵件發(fā)送者相同的方法獲取到我的電子郵件地址:象這篇文章一樣,從文章的頂部獲得地址列表,以及其它有關(guān)我地址方面的公開信息。
過濾軟件一瞥
本文從特定的角度來研究過濾軟件。對于正確識別垃圾郵件和合法消息這方面,我想了解這些不同的方法做得如何。為了回答這個問題,我沒有將注意力特別放在配置過濾器應(yīng)用程序,使之能使用各種“郵件傳送代理(Mail Transfer Agents (MTA))”的細節(jié)上。在 MTA(譬如,Sendmail、QMail、Procmail、Fetchmail 以及其它郵件程序)的最佳配置方面,確實存在著許多奧妙。而且,許多電子郵件客戶機都有自己的過濾選項和插件 API。幸運的是,我研究的大多數(shù)過濾器都帶有相當出色的文檔,里面講述了如何配置它們以與各種 MTA 協(xié)同工作。
為了測試,我開發(fā)了兩組消息集:垃圾郵件和合法郵件。實際上這是我從前幾個月收到的郵件中抽取出的兩組消息,但我又向其中添加了一個重要的消息子集,在這些消息中,有的來自幾年前,這就擴大了測試范圍。我不能確切地知道,在下個月的電子郵件中會包含什么,但過去的郵件已為以后的趨勢提供了極好的線索。這聽上去似乎很神秘,但我的意思是,我不希望把這些模式只限制于一些單詞、短語和正則表達式等,這些也許能描述出最近電子郵件的特征,但卻不能概括成這兩種類型。
除了這兩組電子郵件,我為那些工具開發(fā)了培訓(xùn)(training)消息集,以“了解”什么是垃圾郵件,什么不是垃圾郵件消息。這些培訓(xùn)消息集比較大,而且有一部分是與測試集不相交的。測試集中包含略少于 2000 條的垃圾郵件消息,合法消息的數(shù)目與此大致相同。而培訓(xùn)集中的消息是它們的兩倍。
關(guān)于測試,這里有必要強調(diào)一下一般性的注意事項。在垃圾郵件過濾器中的“誤否認”(False negatives)僅意味著一些不需要的消息進入了郵箱。這不是一件好事,但其本身沒有多可怕!罢`承認”(False positive)是指合法消息被誤判為垃圾郵件。這可能非常糟糕,因為一些合法郵件實際上很重要,甚至非常緊急,有時盡管這些消息是一些聊天性質(zhì)的郵件,但我們也不希望丟失它們。大多數(shù)過濾軟件能讓您將受拒的消息保存在臨時文件夾中,等待您去查看 — 但如果需要查看的文件夾中充斥著大量的垃圾郵件,那么這個軟件的實用性會因此而削弱。
1. 基本的結(jié)構(gòu)化文本過濾器
我所使用的電子郵件客戶機能夠根據(jù)特定郵件頭域、一般性郵件頭和/或正文中的簡單字符串來對到來的電子郵件進行排序。這個功能非常簡單,甚至不包含正則表達式匹配。幾乎所有的電子郵件客戶機都有這樣的過濾能力。
在過去幾個月中,我開發(fā)了少量的文本過濾器。這些少量的簡單過濾器能正確捕獲我所收到垃圾郵件中的 80%。遺憾的是,這些過濾器的“誤承認”的發(fā)生率比較高 — 以至于我不時地需要手工來檢查垃圾郵件文件夾中的某些郵件。(我將可能的垃圾郵件進行分類,放在幾個不同的文件夾中,然后保存它們以形成消息語言資料庫(corpora)。)雖然各個用戶之間具體的細節(jié)會有所不同,但對大多數(shù)讀者來講,這個通用的模式是很有用的:
集合 1:一些人或郵件列表在他們的郵件頭上做了一些有趣的手腳,使得它們與眾不同。我捕獲郵件頭中的某些內(nèi)容(通常是 From:),并將其放在“白名單(whitelist)”中(“收件箱”或其它文件夾)。
集合 2:我執(zhí)行以下垃圾郵件過濾器(沒有按特定的順序):
識別特定的惡意郵件發(fā)送者。
查找作為 From: 郵件頭的“<>”。
查找郵件頭中的“@<”(出于許多原因,許多垃圾郵件都有這個標記)。
查找“Content-Type: audio”。我不需要這個,只有 virii 病毒需要(具體情況因人而異)。
在郵件頭中查找“euc-kr”和“ks_c_5601-1987”,我不懂這種語言,但出于某些原因,我收到了大量韓國垃圾郵件(當然,對于真正的韓國讀者,這條規(guī)則恐怕不太適合他)。
集合 3:存儲那些已知是合法地址的消息。我有幾條這樣的規(guī)則,但它們都僅僅與文字 To: 域相匹配。
集合 4:查找那些在郵件頭中具有合法地址,但通過上一個 To: 過濾器沒有捕獲到的消息。我發(fā)現(xiàn),只要我的郵件地址出現(xiàn)在 Bcc: 域,其中有一串按字母順序排列的地址(譬如,mertz1@……、mertz37@……等)時,那這封郵件肯定是不請自來的郵件。
集合 5:到此,所剩下的可能就是垃圾郵件(它可能有偽造的郵件頭以避免被識別出發(fā)送者的身份)。
2.“白名單”/驗證過濾器
對于垃圾郵件的過濾,有一種主動性相當強的技術(shù),我想稱之為“白名單加自動驗證”方法。這里有幾種工具可以實現(xiàn)帶驗證的“白名單”:TDMA 是一個深受大家喜愛的多平臺開放源碼工具;ChoiceMail 是一個針對 Windows 的商業(yè)性工具;其它大多數(shù)似乎都比較初級。(請參閱本文后面的參考資料,那里有一些鏈接。)
“白名單”過濾器連接到 MTA,只有當接收者顯式地同意接收,才會將郵件傳到收件箱。其它消息會產(chǎn)生一個特殊的質(zhì)詢(challenge)響應(yīng)給發(fā)送者。“白名單”過濾器的響應(yīng)包含某種唯一的可以識別原始消息的代碼,譬如,一個散列或序列標識。這個質(zhì)詢消息包含讓發(fā)送者答復(fù)的指示,以便將其加到“白名單”中(這個響應(yīng)消息必須包含由“白名單”過濾器生成的代碼)。幾乎所有的垃圾郵件信息中的回復(fù)地址信息都是偽造的,所以這個質(zhì)詢通常沒有人會收到;但即便那些垃圾郵件發(fā)送者提供了有用的回復(fù)地址,但他們往往不會響應(yīng)這個質(zhì)詢。當合法的發(fā)送者答復(fù)了這個質(zhì)詢之后,會將她/他的地址添加到“白名單”中,以便將來來自同一地址的消息會自動地通過檢查。
雖然我沒有用過這些工具,而只是自己做了些實驗,但我認為,“白名單”/驗證過濾器幾乎可以 100% 地將垃圾郵件消息阻擋在外面。可以想象,垃圾郵件發(fā)送者會開始在他們的系統(tǒng)中加一個質(zhì)詢響應(yīng),但只要稍微使質(zhì)詢消息變得復(fù)雜些,就可以解決這個問題(例如,要求對代碼做一點小小的人為改動)。而且,如果垃圾郵件發(fā)送者響應(yīng)了質(zhì)詢,那么就會使那些尋求合法地抵御垃圾郵件的人們可以更容易地跟蹤到他們。
“白名單”/驗證過濾器這種做法給合法的發(fā)送者帶來了額外的負擔。由于有些通信者可能出于各種原因而無法響應(yīng)質(zhì)詢,所以會帶來“誤承認”這種情況。在最好的情形下,合法發(fā)送者只需花費一點點精力即可。但在以下情況,發(fā)送者可能無法發(fā)送他們合法的消息:發(fā)送者具有不可靠的 ISP,防火墻的要求過于嚴格,發(fā)送者具有多個電子郵件地址,不能夠理解英語(或者質(zhì)詢所使用的語言),或者發(fā)送者只是忽略了質(zhì)詢以及不想被質(zhì)詢所干擾。而且,有時合法的“通信者”根本不是人,而是不能夠響應(yīng)質(zhì)詢的自動響應(yīng)系統(tǒng)!鞍酌麊巍保炞C過濾器可能需要額外花精力來處理郵件列表注冊、在線購買、網(wǎng)站注冊以及其它“自動通信”。
3. 分布式適應(yīng)性黑名單
垃圾郵件往往被定義為發(fā)送給大量接收方的郵件。實際上,幾乎很少有垃圾郵件被定制為發(fā)送給個別接收方。然而,在缺少預(yù)先過濾的情況下,每個垃圾郵件的接收者必須按自己的“Delete”按鈕來刪除垃圾消息。分布式黑名單過濾器會讓一個用戶的“Delete”操作去警告其他許多用戶,注意這個垃圾郵件消息。
象 Razor 和 Pyzor(請參閱參考資料)這樣的工具運行在服務(wù)器一端,服務(wù)器上存儲了一些已知垃圾郵件的摘要。當 MTA 收到一條消息時,會調(diào)用分布式黑名單過濾器來確定這條消息是否是已知的垃圾郵件。這些工具運用一些智能化的統(tǒng)計技術(shù)來創(chuàng)建摘要,使得在垃圾郵件作了微小的變動或自動的變化(或僅僅是由于傳輸路由的變化而導(dǎo)致郵件頭的更改)時,也不會防止識別消息的身份。此外,分布式黑名單服務(wù)器的維護者經(jīng)常會專門創(chuàng)建一些“蜜罐”地址,以引誘垃圾郵件(但從不針對合法的通信)。在我的測試中,發(fā)現(xiàn)用 Pyzor,從沒有出現(xiàn)“誤承認”這類情況。我認為用其它類似的工具(如 Razor)也不會出現(xiàn)這樣的情況。
對此有些常識。即使那些有不良企圖的發(fā)送者可以篡改合法消息,他們也不可能讓我的好消息樣本向服務(wù)器報告 — 通常只有垃圾郵件是廣泛分發(fā)的?梢韵胂,被大量發(fā)送但又是合法的消息(譬如,developerWorks 時事通訊)可能會導(dǎo)致錯誤報告,但分布式黑名單服務(wù)器的維護者幾乎肯定會檢測到這一點,并快速地糾正這樣的問題。
然而,正如由下面的匯總表所顯示,使用分布式黑名單時發(fā)生“誤否認”的頻率要比其它我所測試的技術(shù)多很多。Pyzor 的作者推薦將這個工具與其它技術(shù)相結(jié)合使用,而不是作為單獨的防線來抵御垃圾郵件。雖然,這似乎合乎情理,但對于識別郵件是否為垃圾郵件這一點,事實上還不清楚這樣的組合過濾技術(shù)是否比單獨使用那些技術(shù)要強。
此外,由于分布式黑名單需要與服務(wù)器進行對話以執(zhí)行驗證,所以,在對我的語言資料庫做測試時,Pyzor 的執(zhí)行效率要比其它技術(shù)慢得多。對于測試小流量的消息,這不是大問題,但對于高容量的 ISP,這可能是個問題。我還發(fā)現(xiàn),每一千條查詢中,總會出現(xiàn)幾次網(wǎng)絡(luò)超時,所以,我的結(jié)果有一些“錯誤”(error),而不是標出“spam”(垃圾郵件)或“good”(合法郵件)。
4. 基于規(guī)則的評定
在基于規(guī)則的垃圾郵件過濾技術(shù)方面,SpamAssassin 是最受大家喜愛的工具,它處于遙遙領(lǐng)先的地位。還有其它一些工具,但它們要么沒有得到廣泛地使用,要么沒有得到積極的維護。對要識別的消息,SpamAssassin(及其它類似工具)評估了大量的模式 — 大多數(shù)是正則表達式。如果有匹配的模式,則增加消息分數(shù),否則,則減少消息分數(shù)。如果消息分數(shù)超過某一特定的閾值,則將其視為垃圾郵件而過濾它;否則認為是合法。
一些評定規(guī)則基本上穩(wěn)定不變 — 例如,偽造的頭和自動執(zhí)行的 JavaScript,幾乎總是垃圾郵件的標志。因為垃圾郵件發(fā)送者所開發(fā)出的產(chǎn)品和詭計在不斷變化,所以需要更新其它一些規(guī)則。今天的垃圾消息中,偉哥和非洲獨裁者的后繼者們也許還風(fēng)行一時,但明天一些新品種的蛇油藥品或色情作品可能會將擠占它們的位置。隨著垃圾郵件的發(fā)展,SpamAssassin 也必須發(fā)展,以跟上它們的步伐。
SpamAssassin 的自述文件中有下列非常有力的聲明:
在最近的測試中,SpamAssassin 區(qū)分垃圾郵件和非垃圾郵件的正確率達到了 99.94%。以后,SpamAssassin 一直會做得越來越好!
我的測試顯示,它沒有達到這個水平。根據(jù)我的語言資料庫,SpamAssassin 大約會發(fā)生 0.3%“誤承認”和 19%“誤否認”的情況(這一比率非常高)。公平而論,這只是評估基于規(guī)則的過濾器,而沒有針對分布式黑名單做選擇性的檢查。此外,我的垃圾郵件語言資料庫中不都是純的垃圾郵件 — 它還包括大量可能是病毒的附件(我沒有打開這些附件做確認,但我知道它們不是我認可的消息)。SpamAssassin 的 FAQ 對查找病毒作了免責(zé)聲明;而另一方面,在查找病毒方面,以下技術(shù)做得更好,所以,這份免責(zé)聲明并不是那么引人注目。
在速度方面,SpamAssassin 比分布式黑名單運行得更快,因為分布式黑名單需要查詢網(wǎng)絡(luò)服務(wù)器。但它的速度還是遠低于下面統(tǒng)計模型(使用本機數(shù)據(jù)結(jié)構(gòu),用解釋型的 Python 編寫的)的非優(yōu)化版本。有關(guān) SpamAssassin 的優(yōu)缺點,請閱讀“用 SpamAssassin 消滅垃圾郵件”(developerWorks,2002 年 9 月)。
5. 貝葉斯(Bayesian)單詞分布過濾
Paul Graham 于 2002 年 8 月寫了一篇極具爭議的文章。在“A Plan for Spam”(請參閱本文后面的參考資料)中,Graham 提議建立垃圾郵件和非垃圾郵件單詞的貝葉斯概率模型。Graham 的文章或者其它任何有關(guān)統(tǒng)計和概率的一般性文章都詳細講述了數(shù)學(xué)方面的背景知識,比我在這里講得更透徹。
其大體思想是,在已知的垃圾郵件中,一些單詞出現(xiàn)的頻率較高,而在合法消息中,另一些單詞出現(xiàn)的頻率較高。運用一些眾所周知的數(shù)學(xué)知識,對于每個單詞,可以生成一個“垃圾郵件指示性概率”。根據(jù)消息中所包含的一組詞,可以用另一個簡單的數(shù)學(xué)公式來確定文本消息的整體“垃圾郵件概率”。
Graham 的想法有以下幾個值得注意的好處:
可以從已分類消息的語言資料庫中自動生成過濾器,而不需要人花費精力來制訂規(guī)則。
可以根據(jù)個別用戶特有的垃圾郵件和合法消息來進行定制。
可以通過少數(shù)幾行代碼來實現(xiàn)這個想法。
運行情況出奇得好。
乍一看,似乎這樣的猜想合乎情理:即,象 SpamAssassin 這樣用手工調(diào)整和耗費大量人力開發(fā)的規(guī)則要比漫無目的的自動方法更能準確地的預(yù)測出垃圾郵件。事實說明這種猜想完全錯誤;旧希y(tǒng)計模型僅比基于規(guī)則的方法要好。附帶的好處是,Graham 樣式的貝葉斯過濾器還是比 SpamAssassin 更快和更簡單。
在 Graham 的文章發(fā)表的這些天里 — 也許就在數(shù)小時里,許多人同時開始實現(xiàn)這個系統(tǒng)。我出于測試目的,使用了由我的通信者 John Barham 所創(chuàng)建的 Python 實現(xiàn)。我感謝他給我提供了這個實現(xiàn)。不過,由于數(shù)學(xué)原理是如此之簡單,以至于每個其它的實現(xiàn)大都相同。
有一些數(shù)據(jù)結(jié)構(gòu)和存儲技術(shù)的問題會影響到各種工具的運行速度。但事實上預(yù)測的精確性取決于很少幾個因素 — 最關(guān)鍵因素可能是所使用的詞法技術(shù),這些因素大都用來消除虛假的隨機字符串。Barham 的實現(xiàn)僅在一個小的集合中(字母數(shù)字加一些其它字符)查看相對較短和不相交(disjoint)的字符序列。
6. 貝葉斯三元模型(trigram)過濾器
貝葉斯技術(shù)建立在單詞模型上,其工作良好。這種單詞模型的缺點之一是,電子郵件中采用的“單詞”的數(shù)量實際上是無限制的。這個事實可能與我們的直覺相反 — 認為一旦全部包括了幾乎所有的英文單詞,您就可以一勞永逸,這似乎很合乎情理。從我以前對全文本索引的研究了解到,這完全是不現(xiàn)實的;“與單詞類似的”字符序列的數(shù)量可能是接近無限,新的文本會不斷地產(chǎn)生新的序列。對電子郵件來說,尤其是這樣,電子郵件包括消息標識、內(nèi)容分隔符、UU 和 base64 編碼等等任意的字符串。從模型中丟棄單詞有多種方式(最簡單的方式是只丟棄出現(xiàn)頻率非常稀少的單詞)。
我決定研究一下,對于貝葉斯垃圾郵件過濾器,一個絕對有限的模型空間究竟工作得有多好。我明確地決定,我的概率模型使用三元模型,而不是“單詞”。當然,這個想法不是憑空而來的;對于語言識別/區(qū)分、英語的密碼唯一長度、模式頻率和相關(guān)領(lǐng)域所進行的大量研究極力推薦將三元模型作為一個良好的單元。
沿著這條思路,我做了幾個決定。其中最重要的選擇是確定三元模型是什么。雖然這比識別一個“單詞”要稍微簡單些,但這完全是一種幼稚的方法 — 查找三字節(jié)的每個(重疊)序列的方法不是最優(yōu)化的。尤其考慮到高位字符 — 雖然在多字節(jié)字符集(換句話說,CJK)出現(xiàn)的頻率相對較高 — 會使三元模型的空間比只在 ASCII 范圍中查找要大得多。進一步將三元模型空間限制在低位字符會產(chǎn)生較小的空間,但整體結(jié)果不是很好。
對于我的三元模型分析,我只利用了高差分三元模型作為消息分類器。但我只是用試錯法(trial and error)才達到了“垃圾郵件”和“合法”三元模型所選定的數(shù)目。對垃圾郵件,我還用了臨界概率,而不是任意概率:我發(fā)現(xiàn)了一個有趣的現(xiàn)象,“合法”語言資料庫中沒有一條消息的垃圾郵件概率是超過 .0071 的,而在 .99 概率范圍內(nèi),只有兩個“誤承認”的情況。然而,將臨界概率從最初的 0.9 降到 0.1,可以使我在“垃圾郵件”語言資料庫中捕獲更多的消息。出于速度方面的考慮,從每個候選消息中挑出不多于 100 個“令人感興趣”的三元模型 — 改變這個數(shù)目,結(jié)果可能略微會有所變化(但不是很明顯)。
本文來源:
http://666323.cn/article/111.html
[復(fù)制鏈接]
鏈接已復(fù)制
上一篇: 私服服務(wù)器如何選擇機房