1. 程式人生 > >乾貨!防運營商劫持

乾貨!防運營商劫持

一、什麼是運營商劫持

什麼是運營商:

運營商是指那些提供寬頻服務的ISP,包括三大運營商中國電信、中國移動、中國聯通,還有一些小運營商,比如長城寬頻、歌華有線寬頻。運營商提供最最基礎的網路服務,掌握著通往使用者物理大門的鑰匙,目前運營商劫持很普遍。

舉個劫持的栗子:

劫持方式:

運營商比較常見的作惡方式有三種,分別是DNS劫持、HTTP劫持、HTTPS劫持:

DNS劫持:這種劫持會把你重新定位到其它網站,我們所熟悉的釣魚網站就是這個原理。但是因為它的違法性,現在被嚴厲的監管起來,已經很少見。

HTTP劫持:雖然DNS劫持已經被監管了起來,但是還有HTTP劫持啊!你DNS解析的域名的IP地址不變,當運營商發現你的是HTTP請求時,就會在裡面插入一些奇奇怪怪的廣告(比如一些banner、浮標、更有甚把你你的商品位給劫持了 WTF...)並且這種現象十分常見,不信你可以試著隨便開啟一個網頁,仔細看看你就會發現一些小尾巴,這就是被HTTP劫持了。

HTTPS劫持:安全的超文字傳輸協議,資料加密這也能劫持?答案是肯定的!該劫持方式有兩種:

  1. 偽造證書,通過病毒或者其他方式將偽造證書的根證書安裝在使用者系統中(較少)
  2. 代理也有客戶的證書與私鑰,或者客戶端與代理認證的時候不校驗合法性,即可通過代理來與我們服務端進行資料互動(較多)

備註:使用本篇的程式碼一定會讓你查到HTTPS劫持的(前提是使用了https)

二、防運營商劫持

準確的來說是防script、iframe注入型劫持,95%以上是這種劫持方式,因為DNS劫持被嚴管了。

運營商是如何劫持的,網上有很多資料,這裡不多逼逼

下面是防劫持程式碼:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>防劫持程式碼測試</title>
  <script>
    console.log('發生劫持,初始化就直接置頂的流氓行為,暫無法防禦,但可以通過埋點記錄LOG,向工信部投訴!!');
  </script>
  <!-- 防劫持 -->
  <script shendun-eddy>
    /**
     * @note 防劫持程式碼
     * @key MutationObserver 提供了監視對DOM樹所做更改的能力 
     */
    (function
() { var srcFilterTags = ['script', 'iframe']; // 域名白名單 可以加多個 var whiteList = ['zeptojs.com']; var whiteListReg = []; // 正則匹配 whiteList.forEach(function(wl) { var wlReg = new RegExp('/.+?\/\/' + wl + '|\/\/' + wl + '|.+?\.' + wl + '|^' + wl); whiteListReg.push(wlReg); }); // 白名單助手 var inWhileList = function(addedNode) { // shendun-eddy 是script的白名單標籤 if (addedNode.src === '' && addedNode.getAttribute('shendun-eddy') !== null) { return true; } var isInWhiteList = false; whiteListReg.forEach(function(wlReg) { if (wlReg.test(addedNode.src)) { isInWhiteList = true; return false; } }); return isInWhiteList; }; // dom觀察器 var mutationHandler = function(records) { records.forEach(function(record) { Array.prototype.slice.call(record.addedNodes).forEach(function(addedNode) { srcFilterTags.forEach(function(tagName) { // 標籤匹配 白名單匹配 if (addedNode.tagName === tagName.toUpperCase() && !inWhileList(addedNode)) { addedNode.remove(); }; }); }); }) }; // 核心 - MutationObserver 提供了監視對DOM樹所做更改的能力 // 優點 - 動態監聽是否有非法的 iframe 和 script 程式碼 // 缺點 - 無法查詢頭部直接插入的程式碼 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver, observeMutationSupport = !!MutationObserver; var html = document.getElementsByTagName('html')[0]; if (observeMutationSupport) { new MutationObserver(mutationHandler).observe(html, { 'childList': true, 'subtree': true }); } // 唯獨直接載入的不能remove掉,非同步載入的都能remove掉!! // *** 記錄頭部的script,通知工信部 *** var eleList = document.querySelectorAll('script'); var len = eleList.length; for (var i = 0; i < len; i++) { // 遍歷操作 if (!inWhileList(eleList[i])) { // do sth 這裡的刪除雖然已經晚了,因為JS是,但是可以統計被劫持數 // sendLog eleList[i].remove(); } } })(); </script> <script>console.log("劫持1");</script> </head> <body> <div>防劫持程式碼測試</div> <div class="father"> <div class="bro"> <div class="xiongdei"> <script src="https://mt.cnzz.com/js/hdpi_canvas.js"></script> </div> </div> </div> <script src="http://zeptojs.com/zepto.min.js"></script> <!-- 這裡執行了 console.log('哎喲,我來劫持你了...'); 雖然訪問了這個script, 但被remove了不會執行--> <script src="http://nansenzsl.coding.me/CBS/shendun_test.js"></script> <script>console.log("劫持....");</script> </body> </html> 複製程式碼

加入運營商劫持程式碼後,不在白名單和安全標籤(shendun-eddy)內的script或者iframe都會被remove掉。

提示:network內能看到載入了其他非白名單內的script程式碼,但它們都沒有執行

nansenzsl.coding.me/CBS/shendun… 為例,程式碼如下:

;(function(){
  console.log('哎喲,我來劫持你了...');
})()
複製程式碼

核心功能

MutationObserver()建立並返回一個新的 MutationObserver 它會在指定的DOM發生變化時被呼叫。

具體引數和用法傳送門:developer.mozilla.org/zh-CN/docs/…

相容性

所有瀏覽器的相容性是92.79%,手機端的相容性更高,程式碼中加了保護所以放心使用吧!

三、總結

目前運營商劫持率大約是3% ~ 25%,它們無處不在。

為了還使用者一個乾淨安全的瀏覽環境,我們需要做好預防措施

  1. 全站https,能防一部分
  2. 加入防運營商劫持程式碼,能防大部分注入型劫持
  3. 記錄Log,記錄證據,向工信部投訴