防治運營商HTTP劫持的終極技術手段

業餘草發表於2017-09-05
運營商HTTP劫持(非DNS劫持)推送廣告的情況相信大家並不陌生,解決的方法大多也是投訴增值業務部門進而投訴工信部。但這種方法費時費力,投訴接聽人員並不瞭解情況導致答非所問的情況有很多,有時候不但受氣最終也沒能完全解決問題,或者解決問題後過了一段時間復發的情況並不少見。


  近年來,運營商HTTP劫持非但沒有收斂,反而變本加厲,玩出了新花樣:比如通過HTTP劫持進行密碼截獲的活動;比如下載軟體被替換的情況;比如劫持進行返利(當然返利不是返給你)的情況。


  本文介紹一種技術手段用來防止HTTP劫持,在大多數情況下不但可以解決廣告推送的問題,也能解決密碼截獲和下載軟體被替換的情況。最終的效果是運營商停止了HTTP劫持,而非劫持後通過瀏覽器外掛進行廣告過濾。此種方法的好處是既不用安裝瀏覽器外掛進行廣告過濾,也不用額外的伺服器(HTTP代理或VPN之類的),並且能防止下載軟體被替換和返利劫持,也能在一定程度上防範密碼的洩漏。


防治運營商HTTP劫持的終極技術手段

我的部落格:CODE大全www.codedq.net業餘草www.xttblog.com愛分享www.ndislwf.comifxvn.com
  要說明這種技術手段的工作原理,首先需要說明大多數情況下運營商HTTP劫持的原理:


  在使用者的瀏覽器連上被訪問的網站伺服器,傳送了HTTP請求後,運營商的路由器會首先收到此次HTTP請求,之後運營商路由器的旁路裝置標記此TCP連線為HTTP協議,之後可以搶在網站伺服器返回資料之前傳送HTTP協議的302程式碼進行下載軟體的劫持,瀏覽器收到302程式碼後就會跳轉到錯誤的軟體下載地址下載軟體了,隨後網站伺服器的真正資料到達後反而會被丟棄。或者,旁路裝置在標記此TCP連線為HTTP協議後,直接返回修改後的HTML程式碼,導致瀏覽器中被插入了運營商的廣告,隨後網站伺服器的真正資料到達後最終也是被丟棄。


  從上述原理中看出,如果需要進行HTTP劫持,首先需要進行標記:如果是HTTP協議,那麼進行劫持,否則不進行劫持。那麼,是否有一種方法,既可以避免被旁路裝置標記為HTTP協議,而目標網站收到的仍舊是原來的HTTP請求,並且不需要任何第三方伺服器呢?答案是有的:
我的部落格:CODE大全www.codedq.net業餘草www.xttblog.com愛分享www.ndislwf.comifxvn.com

  旁路裝置中檢測HTTP協議的模組通常比較簡單,一般只會檢測TCP連線建立後的第一個資料包,如果其是一個完整的HTTP協議才會被標記;如果並非是一個完整的HTTP協議,由於無法得到足夠多的劫持資訊,所以並不會被標記為HTTP協議(我們偉大的防火牆並非如此,會檢查後續資料包,所以這種方法無效)。瞭解了這種情況後,防止劫持的方法就比較簡單了:將HTTP請求分拆到多個資料包內,進而騙過運營商,防止了HTTP劫持。而目標網站的作業系統的TCP/IP協議棧比較完善,收到的仍舊是完整的HTTP請求,所以也不會影響網頁瀏覽。


  那麼如何將瀏覽器發出的HTTP請求拆分到多個資料包中呢?我們可以在本地架設一個代理伺服器,在代理伺服器將瀏覽器的HTTP請求進行拆包,瀏覽器設定本地的代理伺服器即可。我這裡經過測試,預設設定的情況下對三大運營商(電信、聯通、移動)的HTTP劫持現象都有很好的抑制作用。


  這個軟體是個開源軟體,程式碼在: https://github.com/lehui99/ahjs5s 。如果發現有什麼問題,歡迎在Github上提Issue。如果有更新,我也會第一時間更新到Github上。

我的部落格:CODE大全www.codedq.net業餘草www.xttblog.com愛分享www.ndislwf.comifxvn.com

相關文章