目录

  • 劫持产生的原因和方式
    • 1、HTTP劫持
    • 2、DNS劫持
  • http劫持防范

劫持产生的原因和方式

在网页开发的访问过程中,http是我们主要的访问协议。我们知道http是一种无状态的连接。即没有验证通讯双方的身份,也没有验证信息的完整性,所以很容易受到篡改。运营商就是利用了这一点篡改了用户正常访问的网页,插入广告或者其他一些杂七杂八的东西,达到盈利的目的。

运营商的一般做法有以下手段:

  • 对正常网站加入额外的广告,这包括网页内浮层或弹出广告窗口;
  • 针对一些广告联盟或带推广链接的网站,加入推广尾巴;
  • 把我们的站点非法解析到其他的站点,比如我们在浏览器输入http://baidu.com,百度绑定的服务器ip地址是111.13.101.208,此时如果运营商的dns服务器将baidu.com的对应的ip地址改为qq的服务器ip 14.17.32.211,我们输入http://baidu.com就会跳转到QQ的页面。

以上的手段,通过原理归纳为两种:

1、HTTP劫持

当我们使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示“错误”的数据,通常是一些弹窗,宣传性广告或者直接显示某网站的内容,大家应该都有遇到过。做法1、2就是通过这种方式

2、DNS劫持

我们通过域名访问网页的时候,都需要通过DNS服务器把域名解析到对应的服务器地址上,而用户上网的DNS服务器都是运营商分配的。所以,在这个节点上,运营商可以为所欲为。做法3就是通过这种方式

对于以上的劫持方式,我们作为前端的开发人员,通过javascript如何来做到有效的防护呢?

对于DNS劫持,由于发生在域名解析的时候,我们无法控制,javascript更无能为力。我们能做的就是拿起手机,投诉网络运营商,或者直接打工信部电话(12300)投诉。

http劫持防范

对于http劫持,运营商在实现上一般有以下几种做法

  • iframe嵌套展示原来正常网页
  • 在原html中插入js,再通过js脚本安插广告
  • 直接返回一个带广告的HTML

首先我们来看页面被嵌入了 iframe 的情况。网络运营商为了尽可能地减少植入广告对原有网站页面的影响,通常会通过把原有网站页面放置到一个和原页面相同大小的 iframe 里面去,那么就可以通过这个 iframe 来隔离广告代码对原有页面的影响。这种情况比较容易处理。我们只要判断我们的页面是否被嵌套在iframe中即可。Window对象中有两个属性self(指向本身的窗口),top(指向顶层的窗口)可以帮我们来识别判断

我们可以这样简单判断:

if (window.self != window.top) {var url = location.href;top.location = url;
}

但是,有时候我们在实际业务中,我们的页面确实需要被嵌套在iframe中推广,上面的判断会导致页面无法嵌套,这时候我们可以采用配置域名白名单的方式来解决:

var avoidIframeNest = {whiteList : [],init: function(whiteList){if(Object.prototype.toString.call(whiteList) == "[object Array]"){this.whiteList = whiteList;}this.redirect();},redirect: function(){if(self != top){var parentUrl = document.referrer;//是否在白名单内for(var i = 0 ,length = this.whiteList.length ; i < length ; ++ i){var reg = new RegExp(this.whiteList[i],'i');if(reg.test(parentUrl)){return;}}//页面跳转var url = location.href;top.location = url;}}
}

通过配置白名单的方式,比较适合于我们经常用到的域名,通常我们会遇到这样的需求,合作方要求嵌套我们的页面,我们如果将合作方也加入到我们白名单,一方面会导致白名单很长,另一方面我们需要手动去改代码,这样很不方便。这种情况,我们可以在嵌套的url上加上域名的参数判断,要求嵌套页面带上域名参数,如果匹配,就认为合法。

var avoidIframeNest = {whiteList : [],init: function(whiteList){if(Object.prototype.toString.call(whiteList) == "[object Array]"){this.whiteList = whiteList;}this.redirect();},redirect: function(){if(self != top){var parentUrl = document.referrer;//是否在白名单内for(var i = 0 ,length = this.whiteList.length ; i < length ; ++ i){var reg = new RegExp(this.whiteList[i],'i');if(reg.test(parentUrl)){return;}}//判断URL是否带指定参数var iframeDomain = this.getUrlParam('iframe_domain');if(iframeDomain && parentUrl.indexOf(iframeDomain) != -1){return;}//页面跳转var url = location.href;top.location = url;}},getUrlParam : function(key) {var regStr = "^.*[\\?|\\&]" + key + "\\=([^\\&]*)",url = location.href;reg = new RegExp(regStr,'i');;var ret = url.match(reg);if (ret != null) {return decodeURIComponent(ret[1]);} else {return "";}}
}avoidIframeNest.init(['baidu.com']);

通过上述的方法,基本可以解决iframe嵌套问题

对于js注入问题,一般都会在页面中插入图片标签,展示广告,诱导用户点击。针对这种方式,我们可以通过监控页面插入的图片内容来检测。这里,我们可以利用HTML5的新特性MutationObserver 和window下的DOMNodeInserted事件

Mutation Observer(变动观察器)是监视DOM变动的接口。当DOM对象树发生任何变动时,Mutation Observer会得到通知。具体的介绍可以参考:

可以监听某个 DOM 范围内的结构变化

http://www.cnblogs.com/jscode/p/3600060.html

DOMNodeInserted顾名思义,可以监听某个 DOM 范围内的结构变化,这个特性只有在firefox的低版本和webkit中使用,IE不支持,这里我们可以作为低版本浏览器的兼容实现。

var validInsertImg = {httpReg : /^http:\/\/(.*\.baidu\.com|.*\.netwin\.com)\//,//验证非法图片validIllegalityImg : function(src){var httpReg = this.httpReg;return !httpReg.test(src);},init : function(){this.monitor();},monitor: function(){var MutationObserver = window.MutationObserver ||window.WebKitMutationObserver || window.MozMutationObserver;var mutationObserverSupport = !!MutationObserver;//html5监控变化属性if(!mutationObserverSupport){this.mutationListen(MutationObserver);}else{this.insertedListen();}},insertedListen : function(){var that = this;document.addEventListener('DOMNodeInserted', function(e) {var dom = e ? e.srcElement : document.documentElement;if (!dom.outerHTML) {return;}var imgList = (dom.nodeName.toUpperCase() == 'IMG') ? [dom] : dom.getElementsByTagName('img');if (!imgList || imgList.length == 0) {return;}for (var i = 0; i < imgList.length; i++) {that.removeNode(imgList[i]);}});},mutationListen: function(MutationObserver){var that = this;var observer = new MutationObserver(function(mutations){mutations.forEach(function(mutation){var nodes = mutation.addedNodes;for(var i = 0 ; i < nodes.length ; i++){var node = nodes[i];that.removeNode(node);}})})observer.observe(document, {subtree: true,childList: true});},//删除noderemoveNode : function(node){if(node.nodeName.toUpperCase() == 'IMG'){var src = node.src;if(this.validIllegalityImg(src)){node.parentNode.removeChild(node);console.log('拦截可疑静态脚本:', node.src);}}}
}validInsertImg.init();body = document.getElementsByTagName('body')[0];var img = document.createElement('img');img.setAttribute('src','http://m.baidu.com/img/b')body.appendChild(img);var img1 = document.createElement('img');img1.setAttribute('src','/YTRYTRY/A.PNG')body.appendChild(img1);

对于在返回html内容中插入广告,我们可以借鉴注入的方式,进入页面就检测的img图片路径是否在白名单内

以上方法,都是针对运营商劫持的常用手段进行的一些黑科技操作。只能尽量的减少劫持给我们带来的负面影响。针对劫持问题,最好的办法就是全站升级https的方式,验证通讯双方的身份以及信息的安全性。

但是https也不能完全的解决劫持问题,如果https页面被劫持,浏览器会出现空白页面或者提示不安全,无法显示正常的内容。这也会影响到用户的体验。但是还是推荐使用https,如果大部分的网站都使用了https,运营商的劫持无法达到目的,自然不会去做这样吃力不讨好的事情。

JavaScript防流量劫持-前端安全相关推荐

  1. JavaScript防流量劫持

    劫持产生的原因和方式 在网页开发的访问过程中, http是我们主要的访问协议.我们知道http是一种无状态的连接.即没有验证通讯双方的身份,也没有验证信息的完整性,所以很容易受到篡改.运营商就是利用了 ...

  2. java 实现dns劫持_JavaScript 防 http 劫持与 XSS

    原标题:JavaScript 防 http 劫持与 XSS 原文作者: 作为前端,一直以来都知道HTTP劫持与XSS跨站脚本(Cross-site ing).CSRF跨站请求伪造(Cross-site ...

  3. Web如何应对流量劫持?

    虽然互联网经过多年的发展,可是网站使用的底层协议仍是 HTTP,HTTP 作为一种明文传播协议,所有的传输数据都是明文,我们都知道在通信中使用明文(不加密) 内容可能会被窃听,同时网站存在被劫持的风险 ...

  4. DNS劫持、流量劫持,HTTP/HTTPS劫持

    DNS劫持:DNS劫持就是通过劫持了DNS服务器,通过某些手段取得某域名的解析记录控制权,进而修改此域名的解析结果,导致对该域名的访问由原IP地址转入到修改后的指定IP,其结果就是对特定的网址不能访问 ...

  5. HTTP/HTTPS与流量劫持/DNS劫持

    DNS劫持:类似使用导航系统时,导航被劫持,给了一条驶向贼窝的路线. 流量劫持:类似写信,信的内容被改过,收信人并不知情. HTTP: 1,HTTP不能防DNS劫持,劫持者可以把域名解析指向别的服务器 ...

  6. 前端安全——防止流量劫持

    流量劫持一般分为两种:http劫持.DNS劫持 1.HTTP劫持 当我们使用HTTP请求请求一个网站页面的时候,网络运营商会在正常的数据流中插入精心设计的网络数据报文,让客户端(通常是浏览器)展示&q ...

  7. 网站劫持流量是什么意思,怎么防流量被劫持?

    流量劫持,是利用各种恶意软件修改浏览器.锁定主页或不停弹出新窗口,强制用户访问某些网站,从而造成用户流量损失的情形.流量劫持是一种古老的攻击方式,比如早已见惯的广告弹窗等,很多人已经对此麻木,并认为流 ...

  8. android 访问服务器sql_XSS 攻击、CSRF 攻击、SQL 注入、流量劫持(DNS 劫持、HTTP 劫持)—— 浏览器安全

    今天看了 jsliang 大佬关于网络安全的文章,为了加深一下印象,自己动手写一下. 主要参考文章:网络安全 --- jsliang XSS攻击 XSS(Cross Site Script)跨站脚本攻 ...

  9. 流量都去哪了? --- 详谈流量劫持是如何产生的?

    流量劫持是如何产生的? 原文出处:FEX 做最专业的前端[百度前端团队Blog] 原文链接:http://fex.baidu.com/blog/2014/04/traffic-hijack/ 流量劫持 ...

  10. 如何保护网站免受流量劫持?

    越来越多的在线欺诈行为称为劫持行为,盗贼可以窃取客户在电子商务网站上输入的数据,而无需购物者或网站所有者知道这种情况. 它发生在2018年的英国航空公司,当时有 38万客户的数据被网上转售劫持,而小企 ...

最新文章

  1. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest
  2. 转载文章,感觉真的很心酸
  3. 程序人生:32条软件开发的建议和教训,值得读一读!
  4. 阿里巴巴对Java编程【Mysql】的规约
  5. ji计算机一级题库,全国计算机等级考试一级题库0l0ji.doc
  6. windows操作系统自带的端口TCP转发
  7. 公募基金行业与146家公募基金管理机构手册
  8. bzoj3159: 决战
  9. rustdesk:远控工具说明
  10. JS打开新窗口(window.open() 、href)
  11. 用java实现楼层导航_楼层导航
  12. NXP mpc5744p MBDT编译工具链配置
  13. 你看这雪花如此的美丽
  14. 补天漏洞平台为什么能吸引众多白帽和企业?
  15. ubuntu下添加日语输入法
  16. C++学习(三一七)ASCII码表
  17. Office For Mac 中的 Excel 表格怎样换行
  18. 【Codecs系列】颜色空间转换CSconvert:NV21转BGR24和BGR24转NV21
  19. IAR 的 Go to Definition of不能正常使用
  20. oralce 经典习题系列-查询

热门文章

  1. 阿里云服务器怎么重装系统?
  2. 计算文本相似度的常用算法
  3. windows聚焦壁纸不更新_win10系统聚焦壁纸不更新怎么办?
  4. w10不能访问网络计算机,Win10无法联网提示“无法访问您可能没有权限使用网络资源”怎么办...
  5. Vcc(电源)和GND(地)之间接电容的作用
  6. 作为一个大学才开始入门学计算机编程的孩子想要的东西-----听我扯,你蛋疼,他菊紧,我开心...
  7. 【制作脑图】万彩脑图大师教程 | 展开/折叠分支
  8. java工程师认证_Java工程师认证工信部考试.doc
  9. HDU 6070 Dirt Ratio
  10. STM32单片机驱动L298N