程序員職業的特點,難免會影響自己的業余愛好,比如空閑時間別人逛淘寶,程序員就逛博客園、刷微博的時候也會關注一些互聯網技術方面的微博,還有一部分像我,做一名業余站長,利用下班時間維護更新下網站內容,看着IP數的增長、百度收錄、關鍵字的排名攀升,自己也會得到滿足,順帶的是,掛在網站上的幾個GG、百度聯盟廣告也有些許的收入,解決兩餐問題還是可以的,其實程序員做網站最主要的是為了興趣,想賺大錢的話就不會做草根小站長了。
廢話了不少,說說這次遇到的網站被掛惡意代碼的經歷吧;
惡意代碼的表現是:從百度收錄的文章點過來到網站就會彈出好幾個色*情網站彈窗頁,而我從瀏覽器地址欄直接輸入網址的話,就不會出現,按照常規的排查手段,馬上到站點查看有沒有惡意文件,然后檢查下網站的文件有沒有被注入了惡意的代碼,經過排查,都是正常的(這里犯錯了,我只檢查了模板文件,沒有檢查JS文件,為后續留下隱患),繼而,我懷疑是不是廣告聯盟的代碼問題呢?所以,我把模板文件備份一下,把全部的廣告聯盟代碼、分享組件代碼全部都去掉,發現還是會彈窗,因為好幾天都沒能把這個問題解決,跟同學都覺得這個問題真是太神,其中懷疑過VPS的空間商是不是被黑了,但是發現網站更換模板之后就沒有彈窗了,於是還是把排查重點放在模板文件上。
排查有了新的轉機,當我把所有外部引用JS(廣告、分享條、微博、日志推薦)都排查掉之后,我開始懷疑網站的JS文件了,結果在Jquery里發現了這段惡意的代碼,因為惡意彈窗是在網頁一開始加載就連續的彈出來,心想,也應該是在JS一開始加載的地方,在Jquery加載之前,這里值得一提的是,這段惡意代碼也非常有技術含量!
可以看出,在Jquery加載之前,輸出了一段Javascript引用,代碼是引用了一張圖片 link5.jpg ,好,把這張圖片download下來看看
也是很普通的一張圖片,但是你以為這真的是一張普普通通的圖片你就錯了,還記得以前在網上見過一張傳聞有"內涵”的圖片,打開也是一張普通的圖片,但是用記事本打開之后,里面島國的種子地址(聲明:我並沒有下載)所以,用記事本打開它來看看究竟。
其中,document.referrer是獲取網站的來源,比如從百度過來的,referrer="www.baidu.com",很多網站都是利用這個HTTP的屬性來防止盜鏈的,可見,他是判斷了有來源的話才會輸出他的廣告JS代碼,目的就是為了不讓站長容易發現彈窗廣告的問題。
從這次排查惡意代碼的經歷可以看出,網站安全是多么重要的一件事,假如你沒有對用戶上傳的圖片進行檢查,網站就會留下很大的隱患,所以單靠檢查文件后綴是不行的,這方面博客園做得比較好,發布這篇隨筆的時候,link5.jpg 這張圖片無法上傳!
后記:感謝博客園的朋友支持,本篇隨筆成為今天博客園評論最多的文章,今天這么多回復,也有不少園友給出了建議和部分技術上的解答,其中有:
@ Slmuro : 瀏覽器遇到type=text/javascript 不會理會路徑是什么 一律理解為JS文件。就像ASP.NET動態輸出JS時用后綴是.aspx的文件一個道理。
<src 和ipt 這個是因為 JS遇到"</script> “就會不把它當做字符串直接理解為JS結束標簽,所以如果要JS動態寫新的含有"</script> “輸出到頁面,要把這個分隔開來.