运营商、黑客、浏览器厂商、手机厂商,经过某些方式篡改了用户正常访问的网页,插入广告或者其余一些杂七杂八的东西。在一些偏远地区、杂牌运营商尤其常见。 html
DNS 劫持 通常而言,用户上网的DNS服务器都是运营商分配的,因此在这个节点上,运营商能够随心所欲。 例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再经过iframe打开用户原来访问的地址。node
HTTP劫持 在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,并且是html类型请求,则拦截处理。 常见有两种:浏览器
譬以下图: bash
<meta http-equiv="Cache-Control" content="no-siteapp">
<meta http-equiv="Cache-Control" content="no-transform " />
百度官方给的禁止转码声明。各类劫持的手段都有:
1. 直接返回一个带广告的HTML
2. 在原html中插入js,再经过js脚本安插广告;
3. iframe展现原来正常网页。服务器
ul.addEventListener('DOMNodeInserted',function (e) {
console.log(e.srcElement)
console.log(ul.childElementCount)
})
ul.addEventListener('DOMNodeRemoved',function (e) {
console.log(e.srcElement)
console.log(ul.childElementCount)
})
复制代码
以下:网络
function checkDivHijack(e) {
var dom = e ? e.srcElement : document.documentElement;
if (!dom.outerHTML) {
return; //e不是一个dom,只是插入一段文本
}
var imgList = (dom.nodeName.toUpperCase() == 'IMG') ? [dom] : dom.getElementsByTagName('img');
if (!imgList || imgList.length == 0) {
return;
}
var httpReg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn)\//;
var base64Reg = /^data:image/;
var src;
var hijack = false;
for (var i = 0; i < imgList.length; i++) {
src = imgList[i].src;
if (!httpReg.test(src) && !base64Reg.test(src)) {
hijack = true;
break;
}
}
}
复制代码
但这样也有漏洞,若是运营商经过div+style设置背景的方式显示广告图,上述代码就没法检查出来。app
function checkIframeHijack() {
var flag = 'iframe_hijack_redirected';
if (getURLParam(flag)) {
sendHijackReport('jiankang.hijack.iframe_ad', 'iframe hijack: ' + location.href);
} else {
if (self != top) {
var url = location.href;
var parts = url.split('#');
if (location.search) {
parts[0] += '&' + flag + '=1';
} else {
parts[0] += '?' + flag + '=1';
}
try {
top.location = parts.join('#');
} catch (e) {
}
}
}
}
复制代码
eg:dom
window.addEventListener('DOMNodeInserted', checkDivHijack);
function checkDivHijack(e) {
var html = e ? (e.srcElement.outerHTML || e.srcElement.wholeText) : $('html').html();
var reg = /http:\/\/([^\/]+)\//g;
var urlList = html.match(reg);
if (!urlList || urlList.length == 0) {
return;
}
reg = /^http:\/\/(.*\.qq\.com|.*\.gtimg\.cn|.*\.qlogo\.cn|.*\.qpic\.cn|.*\.wanggou\.com)\/$/;
var hijack = false;
for (var i = 0; i < urlList.length; i++) {
if (!reg.test(urlList[i])) {
hijack = true;
break;
}
}
}
复制代码
最终,根本解决办法是使用HTTPS.post
function searchDom( node ){
// 对node 节点处理
if(node && node.nodeType === 1){
console.log(node.tagName)
if(node.tagName === 'IMG'){
// ... 作白名单判断
}
}
var i = 0, childNodes = node.childNodes, item;
for(; i < childNodes.length; i++){
item = childNodes[i];
if(item.nodeType === 1){
// 递归遍历子节点
searchDom(item)
}
}
}
复制代码
3-5年内部岗位(平安、乐信、500万、vivo、oppo)推荐机会,欢迎发简历到: zgxie@126.com