常见劫持手段

按照劫持的方法不同,我将劫持分为下面两类:

  • 跳转型劫持:用户输入地址A,但是跳转到地址B
  • 注入型劫持:有别于跳转型型劫持,指通过在正常的网页中注入广告代码(js、iframe等),实现页面弹窗提醒或者底部广告等,又分为下面三个小类:
    • 注入js类劫持:在正常页面注入劫持的js代码实现的劫持
    • iframe类劫持:将正常页面嵌入iframe或者页面增加iframe页面
    • 篡改页面类劫持:正常页面出现多余的劫持网页标签,导致页面整体大小发生变化

跳转型劫持

为了获取流量,一些电商或者类似百度这样需要流量合作的网站都会有自己的联盟系统,通过给予一些奖励来获取导流,比如:百度或者电商会有渠道分成。

为了区分哪些是第三方给予导流过来的,通常会在url地址增加类似source、from之类的参数,或者进入页面之前通过「中间页」种cookie。

这样,当用户输入一个正常网址的时候,劫持方会在网络层让其跳转到带分成或者渠道号的「中间页」或者带渠道号的页面。这样用户进行下单或者搜索等行为,劫持方会得到「佣金」。

上面说的这类case还算友好,至少用户一般体验不到页面变化,还有类似跳转到钓鱼网站的case,也有不正当竞争的case:用户输入baidu.com跳转到so.com或者sm.cn,而对方网站有故意做成和百度搜索差不多的样子,那时候也帮助法务做了很多案例收集。

题外话:前些年,用户使用百度搜索某些医疗类query,立即用户就会收到电话推广医院,很多用户投诉,不明真相的群众也指责百度,实际这类是运营商把url的关键词卖给了医疗机构,百度只不过是躺枪。。。那时候还做了个项目是加密query。。。

注入型劫持

页面在传输的过程中,被网络层进行内容「再加工」,常见有:注入js、iframe、篡改页面。

注入js

注入js的方式可以通过document.write或者直接改html代码片段等方式,给页面增加外链js,为了做到更难检测,有些运营商会捏造一个不存在的url地址,从而不被过滤或者检测。

案例1:运营商会用自己识别的ip或者域名做js网址,wap.zjtoolbar.10086.cn这类只有在浙江移动网络下才会被解析出来,同理ip也是

案例2:运营商很聪明,知道页面可以检测所有外链js的域名,比如:m.baidu.com我只允许m.baidu.com/static的外链js,其他js都会被记录反馈;为了不被检测出来,我遇见个case电信会访问一个不存在的地址,比如:m.baidu.com/static/abc.js,这个地址在运营商直接返回劫持的js代码,请求不会发到百度的服务器。

被放入iframe或者iframe其他页面

这类case比较少见,但是一些擦边球的网站或者没有内容的垃圾站会用这种方式,他们一般是通过热门关键词之类做SEO,打开网站实际去了广告之类没有任何实际内容,而页面却是内嵌了一个其他网站,我们要是识别出来不被内嵌就需要检测。

篡改页面内容

这类case很少见,一般是在页面底部增加js之外的div,然后展现一些非网站内容。

劫持检测方法

讲了常见的劫持手段有哪些,我们再来看看怎么识别上面提到的这些劫持。

上图是15年8月11日这天百度某页面的劫持情况,那天数据还算不错,之前浙江移动网络劫持率高达40%+,多数劫持来自zjtoolbar.10086.cn这个域名,就是移动的流量提示(还专门启用个域名zjtoolbar,浙江toolbar)。。。

hijack

跳转型劫持

跳转型劫持如果用单纯靠Web页面进行检测比较困难,当时我们做检测是在手机百度(手百)内做检测,所以比较简单,用户输入搜索词(query),打开百度的页面URL,然后当页面加载结束,APP对比访问的URL是否是之前要访问的URL,如果URL不一致,则记录上报。

注入js类页面

  1. 改写document.write方法
  2. 遍历页面script标签,给外链js增加白名单,不在白名单内js外链都上报

检测是否被iframe嵌套

这个通过比较parent对象,如果页面被嵌套,则parent!==window,要获取我们页面的URL地址,可以使用下面的代码:

function getParentUrl() {var url;if (parent !== window) {try {url = parent.location.href;} catch (e) {url = document.referrer;}}return url;}

特殊方法

前面提到类似电信捏造在白名单内的js URL和篡改页面内容的,我们用上面提到的方法检测不到这些信息,如果是在APP内,可以做的事情就比较多了,除了上面之外,还可以比较页面的content-length。当时手百的做法是:

在用户开始输入query的时候,APP访问一个空白页面,页面内只有html、title、head、body、script,而script标签内主要代码就是嗅探是否被劫持。
因为一般劫持不会针对某个页面,而是针对整个网站域名,所以我们的空白页面也会被劫持。
一旦被劫持,那么这么简单的页面结构就很容易做页面劫持分析,分析出来劫持手段就上报case

script内核心代码如下:

function hiJackSniffer() {var files = $.toArray(D.querySelectorAll('script[src]'));var arr = [];for (var i = 0, len = files.length; i < len; i++) {files[i].src && arr.push(files[i].src);}if (arr.length) {return sendImg(arr, 1);}arr = getParentUrl();if (arr && arr.length) {//被嵌入iframereturn sendImg([arr], 2);}if (D.documentElement.outerHTML.length > 4e3) {var tmp = {};var headjs = $.toArray(D.head.querySelectorAll('script'));var unknownCode = [];if (headjs.length) {unknownCode = unknownCode.concat(headjs.map(function(v) {return v.innerHTML;}).filter(function(v) {return !!v;}));}var body = $.toArray(D.body.querySelectorAll('*'));if (body.length > 1) {unknownCode = unknownCode.concat(body.map(function(v) {return v.outerHTML.split('\n').join('');}).filter(function(str) {if (/^<script id="b">/.test(str)) {return false;}return true;}));}return sendImg(unknownCode, 3);}sendImg([], 0);
}

这样做除了可以检测到多余的js外链,还可以检测出来篡改页面内容等case。除了检测域名劫持之外,在用户输入query的时刻访问空白的页面也可以提前完成DNS解析,另外还可以做劫持防御,所谓「一石三鸟」!

劫持防御

最简单粗暴的就是直接上HTTPS,一劳永逸。再就是取证,去打官司或者警告渠道作弊者。除此之外,我们还可以继续利用空白页面做劫持检测。

手百在没有全量https时期(毕竟全站https牵扯的工作量不小),利用空白页面嗅探出当前网络环境存在劫持风险的时候,那么就通过调用客户端的接口,告诉客户端本次启动期间使用https,这样既可以降低劫持风险,又可以通过这个页面小流量测试https数据,将来https全量后,还可以通过空白页面将老版本的APP全量打开https。

原文发布时间:2018-07-02

本文来源掘金如需转载请紧急联系作者

Web 前端页面劫持和反劫持相关推荐

  1. Web前端页面设计流程及注意事项,谨记!

    每天我们打开电脑,看到各种各样的web前端页面.你知道他们是如何制作的吗?为了让页面更具有规范性,让使用者更加方便,在制作页面过程中必须遵循一定的设计流程.在这里就为大家详细介绍一下制作一个Web前端 ...

  2. web前端页面优化——个人见解

    web前端页面优化,我们从JavaScript.css.html这3个方面说下,我的见解,希望大神们能有刚好优化方法,一起探讨. 一.  有关javascript方面 优化见解. 1. 首先举个例子: ...

  3. Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案

    Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案 参考文章: (1)Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案 (2)https://www. ...

  4. web前端页面性能优化SEO优化

    首先什么叫网站? 网站一般分为前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端应该是属于功能的表现.并且影响用户访问体验的绝大部分来自前端页 ...

  5. web前端页面性能优化小结

    一.提倡前端开发工程师在书写xhtml的时候做到结构语义化. 结构中主要包括了head和body两个部分,但是我们经常说的是结构语义化主要是body中的标签,但是我在这里还是简单的说一下head,he ...

  6. web前端页面性能优化(提升页面加载速度)

    我们都知道,对于web应用来说性能很重要,然而性能的优化相关知识非常庞大而复杂,对于性能优化我们需要做些什么,或者瓶颈是什么通常是我们不太了解的.(当然技术大牛除外) 通过查阅相关资料,了解到了一些关 ...

  7. 移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码,更好地将移动web前端页面表现出来。本文整理一些常用的meta标签...

    <!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --><html lang="zh-cmn-Hans"> ...

  8. web前端页面——移动端简单登录页面、下拉菜单(代码详细注释)

      今天跟着专业老师复习了一下前端,感觉好多都已经忘记了,我将今天复习的一些重点整理出来. https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微 ...

  9. 【最简单】Electron 怎么将网页打包成桌面应用(web前端页面怎么生成exe可执行文件)

    在 HTML5的崛起.JavaScript要一统天下之际,有一个名为[跨平台]的技术越来越火.为什么会这么火?因为软件开发者只需一次编写程序,即可在 Windows.Linux.Mac.IOS.And ...

  10. web前端——页面设计

    为xhu.html添加CSS样式,设计实现西华大学主页导航栏的多级菜单,除了本实验明确要求的设置之外,页面效果应尽可能与西华大学首页导航栏一致,主要要求: 设置导航栏菜单横向分布,当鼠标经过导航栏主菜 ...

最新文章

  1. Invalid byte tag in constant pool: 19 与 javax/el/ELManager问题解决
  2. ThreadPoolExecutor 八种拒绝策略,对的,不是4种!
  3. delphi指针简单入门
  4. linux安装服务程序,将 Go 程序安装成系统服务
  5. 深入理解Spring Redis的使用 (九)、通过Redis 实现 分布式锁 的 BUG,以及和数据库加锁的性能测试...
  6. Kubernetes RBAC 详解
  7. PAT A1053 Path of Equal Weight [树的DFS遍历]
  8. C# Thread多线程学习
  9. 【JAVA】数字相加
  10. SPSS 卡方检验(图文+数据集)【SPSS 019期】
  11. python去除停用词_如何从gensim中的文档中删除停用词?
  12. 网页导出pdf不完整_网页怎么打印成PDF文件?使用这款工具轻松实现
  13. Js日期格式化 年月日时分秒
  14. pcie转m2装系统win10_m.2固态硬盘怎么安装win10系统
  15. 清除90天苹果充值记录_王者荣耀开启安卓、苹果系统数据互转
  16. Linux--命名管道(FIFO)
  17. 可以下载《全程软件测试》样章电子版
  18. C语言学习笔记——typedef
  19. TensorFlow报错:AttributeError: module 'tensorflow._api.v1.train' has no attribute 'SummaryWriter'等
  20. 30 岁转行做程序员是什么样的体验

热门文章

  1. ovirt4.4.10安装配置USB重定向
  2. linux 命令打印,Linux终端打印命令使用介绍
  3. 【OpenCv3】 VS C++ (五):SLIC超像素分割算法
  4. 这家曾经的开源明星企业竟然生死未卜了
  5. 【收藏级教程】专业Finereport教程,帆软报表教程
  6. [转载]计算机视觉专业名词中英文对照
  7. 有限元分析简介及伽辽金法
  8. DroidCamX:合体手机与电脑
  9. 目前Java编程语言最流行的7个框架,你了解多少?
  10. foobar2000 正式登陆 iOS/Android