1-现像

最近越来越多的用户向客服反映,在使用我们的App过程中,会莫名其妙的在底部出现广告,甚至黄色信息。这些信息不但困扰了用户,影响用户的使用,最关键是使得用户散失对我们公司的信任,觉得我们公司的开发技术不行(什么???什么?技术不行??出来,出来,我要和你大战三百回合、)。那么这个时候不仅仅是要给用户一个合理的解释,查出现象的原因,杜绝现象的再发生就显得迫不及待了。

2-原因

当时接到用户反馈,我们第一时间对现象发生的原因进行了一系列猜想:
1.是不是我们项目中的第三方jar非官方版本,被植入了一些广告代码
2.dns劫持
3.http劫持
做技术的都明白,那就是经验有的时候是助力,也是阻力。很多时候我们会被我们的经验所羁绊。很多资深技术,看到第一条的现象很容易冒出脑海的肯定是:劫持。
那么第一条的理由是不是可能导致这种现象,从实现来说,完全可以做到的。现在很多开发人员平常开发过程随意之极,频繁的在项目使用一些小众且不规范的第三方jar包。而这些第三方jar也会是一些广告的来源。甚至是安全隐患的来源。
另一方面我们根据我们的猜想对用户及时进行了回访,以便验证我们的猜想的正确性。
1.用的是4g还是wifi?
2.如果是wifi,是不是路边免费的wifi?
3.在什么页面出现?(方便定位是h5页面还是原生界面,对大部分用户,千万不要问他是h5还是原生,只能自己分析,如果原生界面也出现那么第三方jar出现问题的概率很大,如果只是h5界面,那么劫持的可能性很大)
4.使用的是android 还是ios客户端
综合用户的答案,我们总结如下:
1.4g,wifi都出现了。
2.出现的位置都是h5页面。
3.android ios都出现了

3-排查

那基本可以定位是网络劫持原因。那么网络劫持有2种
1.dns劫持
2.http劫持
什么是DNS劫持:
首先DNS是什么。在因特网中,机器相互识别靠的是ip,而ip单纯的无意义数字的结合,很难被人类熟记,所以产生了域名,例如www.baidu.com 就是域名。那么问题来了,我们输入域名,机器又不认识,那么机器怎么去访问?那么就轮到DNS出场了,DNS在作为域名和IP地址相互映射的一个分布式数据库,就是我们的浏览器,会将域名拿到DNS去解析出ip地址来访问,DNS劫持是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。
通俗来说,就是他给我们指向了另一个地址,或者让我们无法访问。电信以前的互联星空的,每次联网打开的第一个网页永远是互联星空。就是典型的DNS劫持。
什么是http劫持:
百度百科的说法:HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。
通俗来说,你要去百度的首页,他会给你百度首页,然后再百度首页的某个部位+个广告。 更具欺骗性,危害更大。(毕竟直接给你导向另外一个网址,用户也不是傻逼,上当的可能性很小。)而这也是现在很多免费wifi植入广告的手段,因为这样能更多的点击。

而很明显,我们遇到的是第二种

4-解决方案

原因定位之后,就是制定解决方案了。根据这个http劫持的特性,我们可以很简单的给出解决方案:
https。https是以安全为目标的HTTP通道,简单讲是HTTP的安全版。就是说数据交流是加密的那么所谓的在返回数据里面加点广告就无从谈起了。而且https也能解决dns劫持(基本杜绝)。而https的成本并不高。连某些黄色网站都开始用https。(我擦,不要问我网址)
当时由于距离发版本时间不足2天,而申请https证书要3-4天,那么我们需要一个临时解决方案。那么怎么解决呢。
既然这些猥琐的劫持者通过插入一段js,那么不让他执行这段js就好了。
因为android3.0以后webview提供了方法可以方便的拦截到所有的ajax请求,那么所有的js,图片下载都可以拦截到。我们可以做个区分,对要执行的js做一个筛选。

从API 11开始引入,API 21弃用
@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {return Tool.getResponse(WebViewActivity.this,url,control);}
从API 21开始引入@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request) {return  Tool.getResponse(WebViewActivity.this,request.getUrl().toString(),control);}
webview在WebViewClient里提供的2种拦截ajax请求的方法

所有我们做了白名单和黑名单的机制,因为现在hybird的开发流行,app嵌入了很多h5,而h5页面的制作也参杂了很多第三方的jar,如果只是单纯的把公司域名下的请求之外的请求拦截,很容易导致h5的某些功能无法使用,所有我们采用了拦截开关的机制。在前2天上报非白名单的url,方便我们派出一些误伤的url,这样加入到白名单,以后开启拦截的开关,就能做到无误伤。(https才是正统的解决方案,拦截请求的局限性太大,而且很容易导致功能误伤)。
然后我拿着我开启了拦截开关的app,上了上海的8号线,连上了花生免费wifi,果然---广告都不见了。
贴一些代码。这边一定要注意,拦截的话一定不能返回null,返回null的话,webview回去正常加载

从API 11开始引入,API 21弃用
@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {return new WebResourceResponse("text/html", "UTF-8", new InputStream() {@Overridepublic int read() throws IOException {return -1;}});}
从API 21开始引入@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, final WebResourceRequest request) {return new WebResourceResponse("text/html", "UTF-8", new InputStream() {@Overridepublic int read() throws IOException {return -1;}});}

5-拓展

中国的网络大环境,http劫持广告很难从源头杜绝。随着越来越多的app嵌入h5,会有越来越多的人在手机端遇到这种劫持广告,作为开发者,一定不要觉得说,这是用户使用免费wifi的原因或者这是运营商的植入广告。我们有的时候改变不了大环境,那么我们做出更多的努力,在app端让劫持广告更难成功。

    码农的路上,纵情向前!

让那些烦人的广告,滚出我们的APP!相关推荐

  1. 去掉谷歌浏览器中烦人的广告

    在这里插入代码片 1.最近这几天我都在写一点博客,无聊的时候都会经常看看自己的CSDN博客的内容是不是有什么写错的地方或者可以改善的地方,但是每次都会有很多烦人的广告出现,即使点击删除了,一跳转页面又 ...

  2. 【资源搜集】ProcessExplorer 帮你彻底干掉电脑里烦人的广告弹窗

    使用电脑时,我们经常会遇到各种烦人的广告弹窗. 有的广告弹窗还设计的特别笋,关闭按钮藏得特别深,本来想关闭结果一不小心就点进去了. 简直是一天好心情的终结者. 今天给大家推荐一个小工具 Process ...

  3. 屏蔽(拦截)无耻烦人的广告

    概述 在平时上网浏览网页或者查找内容时,总是会有一些广告来干扰我们,影响我们的注意力.尤其是网页上显示的动态广告,更是招人厌烦(CSDN最严重,技术人员看技术贴比较多,广告总是在吸引我的注意力).于是 ...

  4. 去除winrar烦人的广告

    最近的winrar总是在打开或其它时候弹出烦人的广告,有没有什么办法解决呢? 答案就是用绿色软件Resource Hacker修改安装文件夹里的winrar.exe文件即可 如果在第3步保存时提示没有 ...

  5. 告别烦人的广告弹窗,教你永久关闭电脑网页弹窗广告

    当我们浏览网页时,频繁冒出的广告弹窗不仅干扰了我们的正常浏览体验,还可能存在安全风险.然而,通过一些简单的步骤,我们可以有效地阻止这些烦人的广告弹窗.在本文中,我们将分享几个实用的方法,帮助您永久关闭 ...

  6. 如何关闭WPS烦人的广告推送

    WPS的广告推送是真的烦人,它不像其他软件能够在在设置中关闭推送,WPS的广告设置中根本就没有关闭推送的选项及设置 下文将带领大家找到关闭WPS广告推送的真正设置 左下角开始中找到WPS offic文 ...

  7. 如何阻止烦人的广告?2020年最佳广告软件删除工具Top5

    广告软件删除工具是比较实用的程序之一,用于阻止或删除网站上的烦人广告. 浏览器已成为我们互联网之旅的重要组成部分,我们在网上寻找的所有内容都要通过浏览器进行引导. 网上有很多免费软件可供使用,人们很可 ...

  8. 如何过滤烦人的广告(适合电脑小白)

    广告一般有两种,第一种是网页广告,一种去除的方法是用电脑管家,在电脑管家工具一栏里开启网页广告过滤. 还有一种是在浏览器里安装广告过滤插件,在浏览器扩展功能里面找. 还有一种广告是软件自带的流氓广告, ...

  9. Microsoft Edge右下角烦人的广告

    日常无聊刷着B站视频·····,首页给我推送了一个热门视频,还挺受欢迎的.于是抱着学习的态度点开了.(指准备伸手) Microsoft Edge?怎么图片变了? 于是准备上手,感觉还不错.(放上展示图 ...

最新文章

  1. Autoit 在word中绘图
  2. C语言实验——矩阵转置_JAVA
  3. [linux]cp和mv对文件和链接影响的区别
  4. linux学习-简单命令介绍及安装VMware Tools
  5. Spring Boot(一) 建立spring boot工程
  6. intrinsicContentSize和Content Hugging Priority
  7. h264码流文件通过计算first_mb_in_slice区分帧边界
  8. jquery开发插件_如何开发jQuery插件
  9. ubuntu一些记录
  10. 制作整人计算机病毒,自己制作简单病毒---三行命令的整人BAT,弹出很多窗口,一直弹到内存耗...
  11. 50欧姆线设计 高频pcb_pcb 50欧姆阻抗匹配设计技巧
  12. 搭建FTP服务器后访问时出现“FTP文件夹错误 无法与服务器建立连接”的解决办法
  13. 《网络攻防》Web基础
  14. chromel浏览器老是提示adobe flash player已过期
  15. 通信系统的组成(精简介绍)
  16. 方差的概念及其计算公式
  17. AR互动百科,“沉浸式”科普在身边!【5月活动特辑】
  18. 生产者剩余的几何解释
  19. 组织中的各种架构师分类
  20. AD(altium designer)15原理图与PCB设计教程(九)——印制电路板的的后续制作

热门文章

  1. 豆瓣CEO杨勃第一次创业的两个宝贵经验
  2. 个人理财帐户管理系统C语言源码
  3. 不伤眼编程启蒙,一套送给孩子有趣又有意义的礼物
  4. 5分钟带你全方位看完Apple新品们!
  5. 系统无法启动用友通服务器,用友T3软件客户端提示用友通服务启动不了,或者用友通服务无法启动...
  6. 11 个对开发有帮助的 JS 技巧,进收藏夹当小词典吧!
  7. bash shell sleep_如何使用Linux Sleep命令暂停Bash脚本
  8. NodeJS优雅的实现Sleep休眠
  9. Java线上兼职家教_基于jsp的家教兼职网站-JavaEE实现家教兼职网站 - java项目源码...
  10. <Linux>进程概念