洞悉互聯(lián)網(wǎng)前沿資訊,探尋網(wǎng)站營銷規(guī)律
作者:Smileby陌少羽 | 2019-05-09 22:31 |點(diǎn)擊:
郵箱里垃圾郵件一直有很多,這讓我不得不重新審視,發(fā)布在網(wǎng)頁上的電子郵箱地址,為了避免垃圾郵件,我刻意將@
更換成#
,也許這在十年前是個(gè)不錯(cuò)的辦法,但是隨著神經(jīng)網(wǎng)絡(luò)和機(jī)器學(xué)習(xí)新算法的發(fā)展,這一類小手段也面臨失效的風(fēng)險(xiǎn),因?yàn)榇蟛糠侄际峭ㄟ^修改電子郵箱地址的“@”符號,通過正則表達(dá)式篩選和特征值匹配,比如hotmail.com、gmail.com、163.com這一類疑似電子郵箱地址的特征,還是可以抓取到電子郵箱地址,所以在將Email發(fā)布到HTML網(wǎng)頁之前我們要對其進(jìn)行加密和混淆。
下面我以john@example.com為例,介紹幾種加密和混淆的反垃圾郵件手段。
1. 生成圖片
利用傳統(tǒng)的圖靈測試CAPTCHA,將防止采集的電子郵箱地址生成圖片,利用機(jī)器不能識別的特性,來區(qū)別人和機(jī)器,生成圖片的方式有很多,除了高大上的Photoshop外,甚至可以使用系統(tǒng)自帶的繪圖工具來完成,另外希望偷懶的話,還有一些在線工具可以幫助到你,比如《Top 10 Websites to Turn Your Email Address into An Image》。
當(dāng)然生成圖片也不是萬無一失的,有理由相信既然基于圖片的驗(yàn)證碼能夠被機(jī)器識別破解,那么基于同樣技術(shù)的電子郵件地址肯定也再所難免,特別是OCR技術(shù)的逐步發(fā)展和成熟,采集程序可以對整張網(wǎng)頁進(jìn)行OCR,最后提取需要的內(nèi)容,所以我們還需要對圖片生成的郵箱地址進(jìn)行噪點(diǎn)、干擾線等混淆,具體可以參考有關(guān)如何防止驗(yàn)證碼被識別的相關(guān)內(nèi)容。
但是經(jīng)過這么一設(shè)計(jì),我們的郵箱地址對于真正需要的人來說則變得不那么友好,人們獲取準(zhǔn)確郵箱地址的難度也加大了。
2、替換關(guān)鍵符號
我們知道爬蟲抓取電子郵箱地址很多都是通過@
這個(gè)特征符號,正如我文章一開頭所述,將這個(gè)符號替換成別的那么將大大降低我們電子郵箱被抓取的概率,當(dāng)然這樣做的壞處是除非給用戶以暗示,否則需要另外說明這是個(gè)電子郵箱地址,比如john#example.com又或者john{a}example.com等等,當(dāng)然智能的電子郵箱抓取軟件可以對這些小把戲自動(dòng)免疫,通過判斷域名也可以得到這是個(gè)電子郵箱地址,所以說將@替換成一個(gè)很特別的符號也是一種生存之道,對于這種替換手段來說,更有甚者將郵箱地址變成句子,比如john AT example DOT com,這樣看來應(yīng)該更安全了,但是也給真正需要這個(gè)電子郵箱地址的用戶帶來了少許困擾。
3、使用JavaScript
JavaScript簡稱JS通常作為嵌入到網(wǎng)頁的一段小腳本,為其提供更為豐富的交互和應(yīng)用,我們通過JS混淆我們的電子郵箱地址,最后再用document.write或者innerHTML等輸出來,這樣的好處是絕大多數(shù)爬蟲并不能執(zhí)行網(wǎng)頁里的腳本,它們只擅長抓取靜態(tài)文本,所以完全不必?fù)?dān)心郵箱地址泄露給爬蟲,另外對于最終用戶來說,通過瀏覽器的解釋,展現(xiàn)在他們面前的全是一個(gè)完整的電子郵箱地址,用戶體驗(yàn)好,不過這種方式有個(gè)較為致命的弱點(diǎn)就是如果用戶瀏覽器不支持腳本,那么郵箱地址也就不能正常顯示了,雖然這種情況不多見。
一個(gè)典型的例子如下,當(dāng)然有很多變形的實(shí)現(xiàn),比如PHP hide_email我這里也不多介紹了。
var username = "john"; var hostname = "example.com"; document.write(username + "@" + hostname); |
尤其值得一提的是ROT13算法的應(yīng)用,ROT13即回轉(zhuǎn)13位,說到底就是將字母表首位銜接成環(huán),將待編碼字母映射到其旋轉(zhuǎn)的13位的字母上,如下示意圖所示:
對于PHP來說,有函數(shù)str_rot13可以直接使用,然后根據(jù)其算法反轉(zhuǎn)即可得到加密前的文本,一般使用如下JS代碼:
<script type="text/javascript">document.write("<n uers=\"znvygb:xvpx@vaprcgvba.pbz\" ery=\"absbyybj\">Fraq n zrffntr</n>".replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);})); </script> |
上述代碼將解碼成以下HTML:
<a href="mailto:kick@inception.com" rel="nofollow">Send a message</a> |
4、使用HTML和CSS混淆
當(dāng)然我們除了采用JavaScript,還可以利用HTML或者CSS的一些小技巧(tricks),使用HTML注釋混淆,在HTML中以<!--
和-->
包含的是注釋,不會(huì)被瀏覽器渲染給最終用戶,那么我們可以充分利用這一點(diǎn)從而將我們的電子郵件地址打造成這樣的:
jo<!-- >@. -->hn@<!-- >@. -->exam<!-- >@. -->ple.com |
這里<!-- >@. -->
不會(huì)被瀏覽器顯示,但是足以混淆機(jī)器爬蟲的抓取。
同樣的結(jié)合CSS的display:none
,我們?nèi)匀豢梢缘玫揭韵骂愃剖侄蔚幕煜?/p>
jo<span style="display:none">@</span>hn@<span style="display:none">@</span>exam<span style="display:none">@</span>ple.com |
同樣的CSS的display:none
必然注定了其包含的文本不會(huì)被顯示,所以最終顯示的也是完整的電子郵箱地址。
對于CSS來說還有一種辦法也可以讓我們規(guī)避爬蟲抓取,那就是利用CSS文本顯示順序的特點(diǎn),比如以下:
<span class="obfuscate">moc.noitpecni@kcik</span> |
其中CSS代碼如下:
.obfuscate { unicode-bidi: bidi-override; direction: rtl; } |
首先文本是被我們逆序的,如果要還原,在不借助JS的情況下可以通過CSS將其再次逆序,從而得到正確的文本,當(dāng)然這個(gè)方法我試用下來有一點(diǎn)不足,那就是用戶選擇復(fù)制電子郵箱地址仍然是逆序的。
最后總結(jié)來看,在對抗垃圾郵件爬蟲收集的方法上充分發(fā)揮了網(wǎng)友的聰明才智,也涌現(xiàn)出各種有才的實(shí)現(xiàn),限于篇幅我也不一一介紹了,其實(shí)沒有絕對的安全,最安全的辦法就是沒有電子郵箱地址,此話怎講?那就是使用聯(lián)系表單(Contact From),讓需要和你聯(lián)系的人直接通過表單和你發(fā)郵件,從而避免了電子郵件地址的公開,網(wǎng)上聯(lián)系表單的開源代碼也有一堆,我的博客最后考慮的方式也是這個(gè),現(xiàn)在大家可以通過右上角“關(guān)于我”找到這個(gè)鏈接并給我發(fā)消息了。