運(yùn)營商HTTP劫持(非DNS劫持)推送廣告的情況相信大家并不陌生,解決的方法大多也是投訴增值業(yè)務(wù)部門進(jìn)而投訴工信部。但這種方法費(fèi)時費(fèi)力,投訴接聽人員并不了解情況導(dǎo)致答非所問的情況有很多,有時候不但受氣最終也沒能完全解決問題,或者解決問題后過了一段時間復(fù)發(fā)的情況并不少見。
近年來,運(yùn)營商HTTP劫持非但沒有收斂,反而變本加厲,玩出了新花樣:比如通過HTTP劫持進(jìn)行密碼截獲的活動;比如下載軟件被替換的情況;比如劫持進(jìn)行返利(當(dāng)然返利不是返給你)的情況。
本文介紹一種技術(shù)手段用來防止HTTP劫持,在大多數(shù)情況下不但可以解決廣告推送的問題,也能解決密碼截獲和下載軟件被替換的情況。最終的效果是運(yùn)營商停止了HTTP劫持,而非劫持后通過瀏覽器插件進(jìn)行廣告過濾。此種方法的好處是既不用安裝瀏覽器插件進(jìn)行廣告過濾,也不用額外的服務(wù)器(HTTP代理或VPN之類的),并且能防止下載軟件被替換和返利劫持,也能在一定程度上防范密碼的泄漏。
要說明這種技術(shù)手段的工作原理,首先需要說明大多數(shù)情況下運(yùn)營商HTTP劫持的原理:
在用戶的瀏覽器連上被訪問的網(wǎng)站服務(wù)器,發(fā)送了HTTP請求后,運(yùn)營商的路由器會首先收到此次HTTP請求,之后運(yùn)營商路由器的旁路設(shè)備標(biāo)記此TCP連接為HTTP協(xié)議,之后可以搶在網(wǎng)站服務(wù)器返回數(shù)據(jù)之前發(fā)送HTTP協(xié)議的302代碼進(jìn)行下載軟件的劫持,瀏覽器收到302代碼后就會跳轉(zhuǎn)到錯誤的軟件下載地址下載軟件了,隨后網(wǎng)站服務(wù)器的真正數(shù)據(jù)到達(dá)后反而會被丟棄?;蛘?,旁路設(shè)備在標(biāo)記此TCP連接為HTTP協(xié)議后,直接返回修改后的HTML代碼,導(dǎo)致瀏覽器中被插入了運(yùn)營商的廣告,隨后網(wǎng)站服務(wù)器的真正數(shù)據(jù)到達(dá)后最終也是被丟棄。
從上述原理中看出,如果需要進(jìn)行HTTP劫持,首先需要進(jìn)行標(biāo)記:如果是HTTP協(xié)議,那么進(jìn)行劫持,否則不進(jìn)行劫持。那么,是否有一種方法,既可以避免被旁路設(shè)備標(biāo)記為HTTP協(xié)議,而目標(biāo)網(wǎng)站收到的仍舊是原來的HTTP請求,并且不需要任何第三方服務(wù)器呢?答案是有的:
旁路設(shè)備中檢測HTTP協(xié)議的模塊通常比較簡單,一般只會檢測TCP連接建立后的第一個數(shù)據(jù)包,如果其是一個完整的HTTP協(xié)議才會被標(biāo)記;如果并非是一個完整的HTTP協(xié)議,由于無法得到足夠多的劫持信息,所以并不會被標(biāo)記為HTTP協(xié)議(我們偉大的防火墻并非如此,會檢查后續(xù)數(shù)據(jù)包,所以這種方法無效)。了解了這種情況后,防止劫持的方法就比較簡單了:將HTTP請求分拆到多個數(shù)據(jù)包內(nèi),進(jìn)而騙過運(yùn)營商,防止了HTTP劫持。而目標(biāo)網(wǎng)站的操作系統(tǒng)的TCP/IP協(xié)議棧比較完善,收到的仍舊是完整的HTTP請求,所以也不會影響網(wǎng)頁瀏覽。
那么如何將瀏覽器發(fā)出的HTTP請求拆分到多個數(shù)據(jù)包中呢?我們可以在本地架設(shè)一個代理服務(wù)器,在代理服務(wù)器將瀏覽器的HTTP請求進(jìn)行拆包,瀏覽器設(shè)置本地的代理服務(wù)器即可。我這里經(jīng)過測試,默認(rèn)設(shè)置的情況下對三大運(yùn)營商(電信、聯(lián)通、移動)的HTTP劫持現(xiàn)象都有很好的抑制作用。
這個軟件是個開源軟件,代碼在: https://github.com/lehui99/ahjs5s 。如果發(fā)現(xiàn)有什么問題,歡迎在Github上提Issue。如果有更新,我也會第一時間更新到Github上。