网站内容劫持 广告(不是一个新概念:运营商访问55BBS网站时某些用户会在屏幕右下角看到 )
优采云 发布时间: 2022-02-13 01:06网站内容劫持 广告(不是一个新概念:运营商访问55BBS网站时某些用户会在屏幕右下角看到
)
事实上,这并不是一个新概念。几年前,国内一些不法运营商,尤其是本土运营商,开始抓取用户浏览器的访问记录,然后根据不同用户的访问行为选择用户。广告被推送到您访问的网页。因为运营商控制着 DNS 主机,所以他们可以根据自己的意愿强行重写 网站HTML 页面,并通过在返回的页面中写入 JavaScript 来注入广告:
这是部分用户访问55BBS网站时,会在屏幕右下角看到一个京东商城广告。这样的广告不仅在一些中小网站中可以看到,在国内大型网站中也可以看到。很多网友会立刻怀疑自己的机器感染了病毒或木马,或者某些恶意浏览器插件又在工作了。事实上,这都是运营商的错。
一些用户会坚决抱怨。运营商有自己的白名单。用户投诉成功后,该账号将被加入白名单,不再投放广告。显然他们不想惹太多麻烦,这种恶心的事情需要偷偷做。
另一方面,很多本地运营商会在其用户协议中加入这种DNS劫持后注入广告的行为,让用户无言以对。例如,北京联通曾经提供不同的计费服务,一种没有广告,另一种有注入广告。当然,如果没有广告,价格会更高。
2010年,青岛联通就因为这样的劫持,败诉了一场闹得沸沸扬扬的官司,被百度*敏*感*词*20万元。索赔在金额上显然是一件小事,但对中国互联网的成熟具有积极意义。在中国,您可以选择的运营商只有少数几家。这就像从一堆你可以忍受的烂苹果中挑选一个。而且,行业本身缺乏道德和完善的法律约束,流氓行为不能通过个人投诉和用户投诉从根本上解决。这或许是互联网发展不成熟的一个无法回避的痛点。
技术实现
理论上,运营商拥有 HTML 页面的所有代码,它可以做任何事情,真正无缝地放置广告,然后将它们返回给用户。但是,这种广告的植入是一种批量行为。如果要为不同的网站页面分别设置广告代码,成本太高。另一方面,植入的 JavaScript 代码片段很容易受到不同的 DOM 环境和 JavaScript 代码环境本身的影响,而植入的广告不会影响原创 网站 页面的显示和行为。为了尽量减少植入广告对原创网站页面的影响,运营商通常会将原创网站页面放入与原创页面大小相同的iFrame中,并使用iFrame来隔离影响原创网页上的广告代码。由于不同用户的某些访问会发生这种劫持行为,所以我举个例子不太方便。为了让大家100%的观察到这个效果,我找了联通的提示页面作为例子:
当访问一个不存在的网站,比如这样一个随机的域名,以北京联通为例,它不会直接返回错误码,而是重定向到这样的错误提示页面:
重定向的 URL 是::8080/issueunziped/bj130404/self0.jsp?UserUrl=
可能没有多少人批评这种行为。毕竟这样的域名是不存在的,对用户和站长影响不大。不过请注意它的左下角和右下角的广告,它注入广告的方式,它使用iFrame嵌套的方式,以及我上面提到的劫持行为是完全一样的。
现在请将上述URL的self0.jsp改成index.htm,即:
:8080/issueunziped/bj130404/index.htm?UserUrl=
你可以看到这样的页面:
刚才说的广告都没有了吧?
可以将 index.htm 页面想象成 网站 的原创页面,然后操作员像这样新建一个页面,并将原创页面以 iFrame 的形式嵌入:
可以将 index.htm 页面想象成 网站 的原创页面,然后操作员像这样新建一个页面,并将原创页面以 iFrame 的形式嵌入:
frames[\'fulliframe\'].location = window.location.href.replace(\'self0.jsp\',\'index.htm\');
这样,你就可以继续在这个新页面中编写代码并引入广告:
怎么破?
既然知道了原理,就很容易想到解决办法。对于这种类型的劫持,有一个共同的特点就是原来的网站页面都是放在一个iFrame中的,所以只要加上这样的脚本,就判断如果页面是在一个iFrame中加载的,让父页面重定向到原创页面:(IP地址不同!)
if(top!==self)
top.location.href=this.location.href;
当然,您也可以重定向到您认为可靠的链接,甚至添加您需要的参数和其他信息(例如运营商添加的广告代码的URL)以记录*敏*感*词*证据。
说多一点
这种劫持方式看似原创粗放,这些使用iFrame实现DNS劫持的运营商还是有些良心的,因为对原页面的影响很小,但是还是有一些本地运营商,直接去原页面就好了。很多情况下,原页面的显示和行为都会受到影响,这个时候问题就会麻烦很多。
首先,我们需要获取该行为的具体信息。一种方法是掌握页面的原创JavaScript方法,DOM对象列表,或者浏览器请求的域名列表(类似于白名单)。如果你在列表之外发现了一些未知的方法,DOM对象的引入,或者非预期的URL的请求,将这些信息发送给服务器进行分析。
例如,页面被强制注入如下代码:
document.write("");
我们可以用一个小技巧来处理它,比如 JavaScript 劫持:
document.write = function(){};
将 document.write 方法设为空函数以禁用注入代码的行为。当然,具体问题还是需要具体分析,掌握信息很重要。但话又说回来,我们只是程序员,我们创建原创页面,在恶意操作者手中,依靠技术技能,我们的力量仍然太小。
另外,联通的广告系统也太缺乏保护了,只要换个链接,Tomcat版本号等信息就会暴露出来,如果真有人要动手……