淺談網站流量劫持防範措施

來源:互聯網
上載者:User

  前幾天上網開啟163首頁時,發現頁面底部莫名其妙的出現一個邊框。這在以前可是未曾有過的,而且以後也絕不可能會有這麼醜陋的設計。

  趨於好奇心,立刻在邊框上點了右鍵審查元素。尼瑪,不看不知道,網易首頁的HTML何時變得這麼劣質了?

  沒有doctype聲明,連title元素都沒有。script還是language=JScript風格,這得追溯到多少個世紀前了~ 最劣質的是架構居然還是<frameset>元素。。。

  

  不用說,這顯然不是網易的頁面。頁面裡的ad字樣,早已深深的出買了它,這就是個廣告頁面!

 

  話說生在天朝,對於各種劫持早已司空見慣。

  在網頁裡劫持廣告,油價2塊錢一升的時代就有了,過了世界末日依舊存在,說明其中的利益是巨大的。

  不用計算,用手指估算下就知道了。我朝有好幾億電腦和手機使用者,每天有無數個網頁被開啟。哪怕在1%的網頁裡插一個廣告,都有數百上千萬次的展示數量,其中的商機不言而喻。。。

  儘管對此有些無奈,但只要插入的廣告不影響正常上網,也沒什麼意見。如果水平夠高,完全可以偽裝成頁面裡本來的廣告,至少形式上一樣,看不出任何的破綻。這樣非但不BS,反倒會有些佩服。

  然而,至今見過的各種廣告劫持代碼,簡直一個比一個劣質。這一次見到的,算是垃圾中的戰鬥機了。隨便找個網頁編輯器,自動產生的HTML也比這強多了,再隨便找些css稍微修飾下,完全就不會被一眼看出是山寨套牌網頁了。尼瑪的這本身就是暗地裡的幹活,卻沒有任何簡單的加密混淆,還光明正大的明文寫著廣告字樣,這不是赤果果的秀智商下限嗎?

  不過今天既然花時間吐槽這破玩意,就乾脆再深入的討論討論未來可能還會出現的變招。

  

  

Lv1. 當前最常見的:把被劫持的網頁套在自己的空殼裡。

  其實這樣做的目的很明確,讓廣告顯示在瀏覽器的最上方。一般為了達到這個效果,會把廣告顯示在頁面的右下角,蓋住被劫持頁面的捲軸,看起來就像是浮動在瀏覽器之外一樣!

  這招夠狠,乍一看,還真以為是QQ之類的軟體彈出的訊息框呢。不過只要把瀏覽器視窗退出最大化,順便再拖一下視窗,廣告也跟著動起來了:)假李鬼就瞬間原形畢露了!

  

防範措施

  這種劫持毫無技術含量可言,反劫持也相當容易。只要在自己網頁裡驗證下window.top,是不是在合法的URL列表裡。如果不是,那就不允許被內嵌在其他網頁內。更好的辦法就是把top地址提交到後台伺服器上,統計下究竟有哪些網站套了自己的頁面。

   

Lv2. 在返回網頁裡插入外鏈<script>

  這種做法相比之前的,要隱形多,至少不會把人家網頁的源檔案給替換了。

  當然,如果僅僅是在網頁的最後面插入<script>,那還是能被瞬間揭穿,甚至會報毒,因為這太山寨了!有哪個正常的網頁會在</html>後面跟內容呢?只有掛馬的指令碼。。。

  不過,要是放對地方,還真不能一眼看出。例如把廣告的<script src="">插在<head></head>其中的密密麻麻引用外部js的地方,至少能混上一段時間了。

防範措施

  一般來說,插入的<script>大多都是外鏈形式的,這樣廣告變換會比較靈活。對於這種劫持,就要使用類似殺毒軟體掃描可疑模組的原理。

  廣告不管怎樣插,最終都會以靜態HTML留在網頁裡,這是不容抹去鐵證!

  當我們的網頁HTML載入完畢,觸發DOMContentLoaded時,我們可以開始掃描一遍DOM內所有的<script>標籤。如果發現有不在信任清單裡的src,那麼網頁很有可能被注入了可疑的指令碼!

  我們可以提交可疑指令碼的url到後台伺服器,做進一步認證。如果確實有風險,那麼必須彈出警告框提醒使用者。

  

Lv3. 在返回網頁裡插入內建<script>

  相比外鏈的指令碼,內建的就棘手的多。外鏈的url網域名稱的總是那麼幾個,可以簡單的實現過濾。但內建指令碼就千變萬化了!隨機變數名,插入廢代碼,各種玄乎。。。不過,魔高一尺,道高一丈~

防範措施

  想最簡單的對付這種劫持,我們必須預先預設個規定,來識別真假指令碼元素。我們給自己的<script>元素設定個固定的標籤,例如<script myjs="true">。當然具體的標籤名和值是經常變動的,對於劫持程式來說,顯然不知道會有這麼個規矩,仍然傻乎乎的插入<script>...</script>。

  於是在之後的"肅反運動"中,可以直接清洗掉了。。。

  

Lv4. 在返回網頁的<script>裡混入廣告代碼

  隨著劫持程式不斷升級,招數會變的越來越狠。說不定某天,劫持程式內建一個html語義分析器,智能的把廣告指令碼合并混淆到頁面原先的js裡!

  若要真是這樣,那麼之前說的給自己的指令碼元素加上特徵碼也無濟於事了。因為特務已深深的混入到了我們內部,真真假假很難被識別!

  最致命的是,指令碼未必都是放在<script></script>,也有可能是<element onxxx="">的內聯形式。。。這下麻煩大了,我得想想怎麼解決。。。

防範措施

  對於這種情況,還真找不到一個簡單的方法來識別。唯一能走通的路,就是在發布HTML時,記錄下檔案的Hash值。可以把值寫入網頁,或者存在資料庫裡。

  當網頁內容載入完成時,我們通過ajax再次讀取當前頁面的內容(一般來說讀的就是當前頁面的快取資料)。通過同樣的演算法算出頁面的校正值,和原始值一比對,就知道頁面是否被第三方篡改了。

  我們還可以把篡改過的html發到後台,找出字串差異部分,讓技術人員分析分析到底做了哪些手腳。

  當然,這隻限於靜態網頁。

  

Lv5. 在返回網頁的外鏈指令碼裡混入廣告代碼

  這招可算是終極篇 ———— 它完全不修改任何HTML內容!

  然而,一般的網頁多多少少要外鏈幾個js檔案吧。於是,那些外鏈的指令碼就成了香餑餑的肥肉被盯上了!

  當然也可以像驗證html那樣,事先計算出所有的js檔案的hash值,然後再使用ajax重新讀資料認證比對。

  不過可別忘了,外鏈js的路徑可以是任意的,而ajax只能讀取同來源站點點。而且,外鏈的<script>也無法讀取其text內容。於是當我們使用網站外的js檔案時,劫持程式可以肆無忌憚的從中混入代碼!

防範措施

  由於受到沙箱策略的嚴格控制,我們根本無法獲得外部js內的實際內容,所以:走為上。盡量不使用外部網站的js檔案。

  對於自己網站,但不是同個網域名稱的,可以使用Flash的URLLoader跨域載入,只需部署一個crossdomain.xml即可。

  

Lv6. 劫持程式過濾掉了我們的反劫持代碼

  這樣的劫持已經超越人類了,趕緊派一個神做了它吧。。。

  ============================================

  

  暫時就YY到這裡,以後有新的想法或更好的解決方案,繼續來這裡補充。

  大家有什麼巧妙的檢測方法,歡迎留言~

  上面說了一大堆,其本質無法就是在用戶端,把使用到的資源和伺服器原始資源二進位校正,將出現問題的資源反饋給後台記錄,找出安全隱患。

  雖然這裡假象嵌入的僅僅是廣告指令碼,然而這種指令碼擁有和頁面內其他指令碼一樣的許可權,因此可以輕而易舉獲得使用者的cookie。

嵌入的指令碼甚至可以通過WebSocket串連到駭客控制台,發送你的滑鼠和鍵盤的一舉一動,以及頁面上顯示的內容;對方還可以遠端控制,讓js在頁面裡悄悄執行各種意想不到的操作。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.