网站内容劫持 广告(15年主导做百度搜索结果页面反劫持的方法)

优采云 发布时间: 2021-10-27 11:24

  网站内容劫持 广告(15年主导做百度搜索结果页面反劫持的方法)

  前几天看到一篇写js文件的关于反劫持的文章。想起自己在百度搜索结果页面领导反劫持项目15年,研究了一下,整理成文章,分享给大家。

  常见的劫持方法

  根据劫持方式的不同,我将劫持分为以下两类:

  跳转劫持

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

  为了区分哪些是第三方提供的,通常会在URL地址中添加source和from等参数,或者在进入页面之前使用“中间页面”cookie。

  这样,当用户输入正常的网址时,劫持者就会将他重定向到带有共享或频道号的“中间页面”或网络层带有频道号的页面。这样,劫持者就会在用户下单或搜索时获得“佣金”。

  上面提到的案例还算友好,至少用户一般不会遇到页面变化,有跳转钓鱼网站的案例,还有不正当竞争的案例:用户输入跳转到or,对方网站 故意让它看起来像百度搜索。当时我也帮法务采集了很多案例。

  题外话:前几年,用户使用百度搜索某些医疗查询,立即会接到用户宣传医院的电话。不少网友抱怨,不知道真相的人也纷纷指责百度。其实这类网址是运营商卖给医疗机构的关键词,百度只是一把*敏*感*词*。. . 当时,另一个项目是加密查询。. .

  注入劫持

  在页面传输过程中,内容被网络层“重新处理”。常见的例子包括:注入js、iframe、篡改页面。

  注入js

  注入js的方式可以是通过document.write或者直接改html代码片段来给页面添加外部js。有些运营商为了增加检测难度,会编造一个不存在的URL地址,使其不被过滤或检测。

  案例一:运营商会使用自己标识的ip或者域名作为js URL,只能在浙江移动网下解析,ip也是一样

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

  放入 iframe 或 iframe 其他页面

  这种情况比较少见,但是一些边缘球网站或者没有内容的垃圾站会用这种方法。他们通常通过流行的关键词做SEO,打开网站实际上去没有广告等实际内容,而是页面嵌入了另一个网站。如果我们认识到它不是嵌入的,我们需要检查它。

  篡改页面内容

  这种情况比较少见,一般是在页面底部添加js以外的div,然后显示一些非网站的内容。

  劫持检测方法

  讲了常见的劫持方法,我们来看看如何识别上述劫持。

  

  劫持统计

  上图为2015年8月11日百度某页面被劫持,当天数据还不错。浙江移动网络劫持率高达40%+。域名zjtoolbar,浙江工具栏)。. . 跳转劫持

  仅依靠网页更难检测跳转型劫持。当时我们在手机百度(handbai)里做了检测,所以比较简单。用户输入搜索词(查询),打开百度的页面URL,然后页面加载时,APP比较访问的URL是否是之前访问过的,如果不一致,记录并报告.

  注入js类型页面重写document.write方法遍历页面的script标签,添加白名单到外链js,不在白名单中,上报js外链检测是否嵌套一个 iframe

  这将比较父对象。如果页面是嵌套的,则 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里面,除了上面的,还有更多的事情可以做。此外,您还可以比较页面的内容长度。当时,手白的做法是:

  当用户开始输入查询时,APP访问页面中只有html、标题、头部、正文和脚本的空白页面,脚本标签中的主要代码是嗅探是否被劫持。

  因为一般劫持不会针对某个页面,而是针对整个网站域名,我们的空白页面也会被劫持。

  一旦被劫持,这样一个简单的页面结构就很容易被分析为页面劫持。如果分析劫持方式,就会报案。

  脚本中的核心代码如下:

  

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) {

//被嵌入iframe

return 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 (/^/.test(str)) {

return false;

}

return true;

}));

}

return sendImg(unknownCode, 3);

}

sendImg([], 0);

}复制代码

  这样,除了检测多余的js外链,还可以检测篡改页面内容等情况。除了检测域名劫持外,还可以通过在用户输入查询时访问空白页面来提前完成DNS解析,也可以用于劫持防御,即所谓的“三鸟一石”!

  劫持防御

  最简单粗暴的做法是直接使用 HTTPS,一劳永逸。然后是证据采集、诉讼或警告渠道骗子。此外,我们可以继续使用空白页面进行劫持检测。

  在没有全量https的时期(毕竟整个站点https涉及的工作量不小),当用一个空白页面嗅出当前网络环境存在劫持风险时,那么在这个启动期间它会调用客户端接口告诉客户端使用https,这样不仅可以降低被劫持的风险,还可以通过这个页面的小流量来测试https数据。日后全额https充值后,还可以通过空白页面打开老版APP全额充值。

  @三水清

  未经许可请勿转载。

  掘金的更新比官方账号晚了大约一周。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线