乾貨!防運營商劫持
一、什麼是運營商劫持
什麼是運營商:
運營商是指那些提供寬頻服務的ISP,包括三大運營商中國電信、中國移動、中國聯通,還有一些小運營商,比如長城寬頻、歌華有線寬頻。運營商提供最最基礎的網路服務,掌握著通往使用者物理大門的鑰匙,目前運營商劫持很普遍。
舉個劫持的栗子:
劫持方式:
運營商比較常見的作惡方式有三種,分別是DNS劫持、HTTP劫持、HTTPS劫持:
DNS劫持:這種劫持會把你重新定位到其它網站,我們所熟悉的釣魚網站就是這個原理。但是因為它的違法性,現在被嚴厲的監管起來,已經很少見。
HTTP劫持:雖然DNS劫持已經被監管了起來,但是還有HTTP劫持啊!你DNS解析的域名的IP地址不變,當運營商發現你的是HTTP請求時,就會在裡面插入一些奇奇怪怪的廣告(比如一些banner、浮標、更有甚把你你的商品位給劫持了 WTF...)並且這種現象十分常見,不信你可以試著隨便開啟一個網頁,仔細看看你就會發現一些小尾巴,這就是被HTTP劫持了。
HTTPS劫持:安全的超文字傳輸協議,資料加密這也能劫持?答案是肯定的!該劫持方式有兩種:
- 偽造證書,通過病毒或者其他方式將偽造證書的根證書安裝在使用者系統中(較少)
- 代理也有客戶的證書與私鑰,或者客戶端與代理認證的時候不校驗合法性,即可通過代理來與我們服務端進行資料互動(較多)
備註:使用本篇的程式碼一定會讓你查到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%,它們無處不在。
為了還使用者一個乾淨安全的瀏覽環境,我們需要做好預防措施
- 全站https,能防一部分
- 加入防運營商劫持程式碼,能防大部分注入型劫持
- 記錄Log,記錄證據,向工信部投訴