【多图慎入】自由门、HTTP劫持和浏览器缓存

首先交代一下事件发生背景:作为一只用不起收费VPN的穷屌丝,我在国内期间仍然使用免费的轮子系列翻墙代理软件(如,自由门)浏览墙外网站。(goagent不能看外链的youtube视频)

今天刷Tumblr的时候,发现自己刚发的帖子里好像混进去了神马奇怪的东西:

1

我第一想到的就是:曾经干净清新的Tumblr终于也沦陷为无良小广告的丧尸了么。

但是,在Dashboard里查看了我刚才发的原帖子的Markdown/HTML后,并没有找到任何可疑的内容。

轻博客自身的HTML模板是我自己亲手定制的,所以也不可能会成为植入广告的来源。

那么,这个无良小广告到底从何而来的呢?

第一件要做的事情当然就是检查源代码嗯。

起初我没有在HTML的前半部分发现任何异常(或者至少说,没有找到类似<iframe>这种可疑的最有可能植入广告的东西)……于是目光自然就定格到了页面的最后一部分,<!-- BEGIN TUMBLR CODE -->后面的<iframe>元素上。

12

很显然,这个<iframe>只可能是Tumblr自身提供的工具栏,也就是当本人登录Tumblr之后页面右上角显示的“Customize” “Dashboard”导航按钮(因为这是页面上唯一能够识别出Tumblr的外观元素)

于是试着点开源链接之后,是怎样的效果呢……

13

果然是Tumblr的导航按钮,但是,正中莫名其妙地多出了一个硕大的Google Ads广告!

这个页面的源码想必很简单,现在来看一看……

14

感谢Tumblr前端工程师良好的缩进风格,我很快就找到了这么几行违和感强烈的代码。一个<center>居中标签包着一个Google Ads的script。恶心人的广告就是寄身在这里的。

这段总计11行没有缩进的代码怎么看都不可能来自于Tumblr,那么它到底又是从何而来的呢?

因为排除了是Tumblr的原因,我忽然想到去查一下自己的博客主页是不是也如此。果了个然,在页面里发现了同样的无良小广告元素:(类似地也是嵌入在Blogger自身导航栏<iframe>的内容里面的)

16

甚至在Blogger的编辑界面里也有这货:

17

和被污染的Tumblr页面对比一下,是完全相同的11行代码。这段天杀的代码如下:

而且比较一下就可以发现,这段<center>代码如出一辙,总是紧接在正常页面HTML的<body>元素后面出现,以达到任何网页一打开正上方居中皆是一个斗大的嵌入广告想看不到都不行的强烈视觉效果……

18

为了慎重起见,我把所有主流的浏览器试了一遍(嘛,对于前端开发来说这些是必须有的):Chrome,Firefox,Safari,IE,Opera,还有一个最干净的开发版Chromium。所有的都出现了无良小广告,基本上排除了是流氓软件插件篡改HTML的可能性。

好吧,你污染我的主页倒也罢了,竟然连大小姐的博客也不放过……不可饶恕!

21

HTTP劫持,我还真的完全没接触过。倒也不是说以前上网从来没遇到过,不过估计遇到的时候我还处于在家占着一根电话线拨号上网的时代,Win 98+IE上新浪雅虎21cn,哪里懂什么HTML什么HTTP劫持,反正一样是广告满天飞。之后就一直多年逍遥在教育网和国外ISP上了。

国内ISP现在已经无良到这种程度了?HTTP劫持嘛,依我的想象力最严重就是搞个<iframe>加个广告包上去,竟然还有功夫写个算法把<body>元素识别出来然后“人性化”地把广告代码居中再插到最前面好让用户一打开页面第一眼就能看到?

当然,我首先怀疑到的自然是一直开着的的自由门代理。关掉自由门之后再刷新Chrome和Safari,果然,Tumblr和主页(www.soimort.org)上镶嵌的无良小广告消失了。

9

8

但令人费解的是,Firefox和IE无论怎样刷新多少次,依然是返回被劫持之后受污染的页面。(注意到嵌入广告的大部分被我那个设置了z-index的导航栏压在下面了……垃圾广告程序员你们的技术水平还不够过硬啊残念残念lol)

1

7

3

乍一看有点略诡异。莫非这个流氓程序还会根据HTTP headers的User Agent选择性劫持HTML植入广告?

还有,既然关了自由门的代理还存在这种情况,难道说真的是无良ISP在某个环节劫持了HTTP?

自由门是通过127.0.0.1:8580这个SOCKS代理服务器访问外部网络的,像traceroute这类基于ICMP协议的工具压根查不出什么东西。(traceroute不走代理)

所以说想查到自由门用的外部服务器IP对于我这种网络小白来说压力略大……

0

嘛,我只是一个web designer而不是hacker,虽然对于网络方面一窍不通,不过以前做前端设计的经验告诉我很有可能是浏览器缓存的问题。

22

于是清空之……

25

竟然真的不见了。(汗–||)

23

对比一下有缓存和没缓存时候的区别:之前有缓存时,服务器返回的Status是304 Not Modified:(此时浏览器直接从本地缓存中取出页面来渲染)

31

而在清除缓存之后,服务器返回的Status是200 OK:(此时由于本地没有缓存,浏览器GET远程服务器、下载得到新的页面)

33

于是来简要总结一下原因:

在我们的浏览器第一次访问某个网页时,服务器返回的HTTP Response Headers中包含一个Last-Modified的参数,标示该页面最近一次更新的时间。这时HTTP返回的状态码是200(OK),浏览器将GET来的页面渲染,同时存入缓存。

34

当浏览器再次访问该网页时(比如,一次刷新),浏览器会在发送的HTTP Request Headers中加上一个“If-Modified-Since”参数,这个参数就是上一次得到的该页面的最近更新时间(Last-Modified参数)。而服务器端会把这个时间同自己的最近更新时间作比较,如果两者一致,说明客户端自从上一次访问以来服务器端的文件并没有任何修改,于是直接返回状态码304(Not Modified)。浏览器得到这个状态码,就直接把本地缓存里的页面拿出来渲染,节约了带宽和用户等待的时间。

如此,HTTP的请求/响应headers决定了页面的缓存状态,这就是浏览器的缓存机制。

35

上述貌似奇怪的现象,正是浏览器这种缓存机制造成的问题:

前面说过,HTTP劫持的代码注入是自由门的无良代理服务器加上去的,和托管俺主页(www.soimort.org)的服务器(pages.github.com)没有一丝一毫关系。

于是,被小广告代码污染的HTML之前被下载、渲染、存到本地缓存,关闭了劫持HTTP的无良代理之后刷新访问,服务器上原有的内容并没有改变,它对于“最终到达用户的数据”的正确性不负责,也不可能知道途中数据被篡改与否,只知道根据浏览器发出的请求(“If-Modified-Since”)和自身状态(“Last-Modified”)作出判断,返回一个状态为304(Not Modified)的Response Headers。既然缓存没有过期,浏览器于是又把包含有无良小广告的HTML从本地缓存里拿出来渲染了,而非重新从远程服务器下载原来的页面(如果没有缓存的话,这个时候由于没有通过从事HTTP劫持勾当的代理,下载得到的显然应该是“干净”的页面)……这就造成了“关掉无良代理仍然有注入广告”的假象。

经历了这次HTTP劫持事件,总结几点:

首先,最直接地,自由门如今已经沦为轮子组织的摇钱树了,或者,像我一样使用该系列软件翻墙的全国人民,都已经沦为轮子组织的人肉摇钱树了……(这么说应该不过分吧)

毕竟是免费软件,所以,从道义上说,你不能指责他“流氓”,反正你爱用不用。既然许多人都在用,植入广告也许是个理所当然的盈利方式。(这一点上稍微比国内某些你付了钱给他还要劫持你HTTP投放广告的土匪ISP稍微好那么一些,当然至于到底好多少我也不好说)

更重要的是,通过自由门这类代理软件翻墙上网,访问未加密的HTTP连接,基本上是没有任何隐私性可言的。他能够劫持正常的HTML注入广告,当然也完全可以监控你的一切连接、你在网上的一举一动。

虽然他宣称是保护用户隐私安全的,但其实不过是你把通过国内ISP那些有可能导致被有关部门查水表的那些记录,全部放到了他的眼皮底下而已。所以,这只是个取决于你更信任哪一方的问题。

我的哲学是:不作恶。除了自己以外,不能轻信其他任何人不会作恶。所以,改天有空,还是在GAE或者AWS上面搭个自己的代理吧。

(・U・)

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

Category

Archives