用js屏蔽被http劫持的浮动广告实现方法


Posted in Javascript onAugust 10, 2017

最近发现网站经常在右下角弹出一个浮动广告,开始的时候以为只是浏览器的广告。

后来越来越多同事反映在家里不同浏览器也会出现广告。然后深入检查了下,发现网站竟然被劫持了。

然后百度了一大堆资料,什么http劫持、dns劫持、运营商劫持之类的,确定真的是中招了。看图:

用js屏蔽被http劫持的浮动广告实现方法

用js屏蔽被http劫持的浮动广告实现方法

真是偷梁换柱啊,被插入广告代码了。真是无良奸商,什么都做得出。

然并卵,最重要的解决办法是啥?然后把问题扔给了运维的同事。

最终结果是解决不了。没错,就是这么的坑爹。除非采用https。网上那些什么打电话、发信投诉之类的貌似没啥用。可能是运维太烂了。反正结果就是没结果。

然后,没办法啦。只能我们大前端自己想办法屏蔽啦。然后开启了研究劫持代码之旅,

......过程省略了800字寻找过程。

最终发现了,被劫持的广告会定义一个js全局变量_pushshowjs_ ,里面保存了一些劫持广告的相关信息,然后创建一个id为_embed_v3_dc的div放广告。并且每次都是一样的,不会有变化。

根据劫持广告的投放原理,最终使用了js屏蔽被劫持广告的方法。

具体代码如下:

;(function($,window,undefined){
 var needClear=false,
  timeout;
 if(window._pushshowjs_){
  console.log("adHttp");
  needClear=true;
 }
 window._pushshowjs_={};
 Object.freeze(window._pushshowjs_);//让对象只读, 防止属性被直接修改
 Object.defineProperty(window, '_pushshowjs_', {
  configurable: false,//防止属性被重新定义
  writable: false//防止属性被重新赋值
 });
 if(needClear){
  timeout=setInterval(function(){
   if($("#_embed_v3_dc").length>0){
    $("#_embed_v3_dc").remove();
    console.log("http清除");
    needClear=false;
    clearInterval(timeout);
   }
  },500);
  $(window).load(function(){
   if(needClear){
    setTimeout(function(){
     clearInterval(timeout);
     console.log("清除");
    },2000);
   }
  });
 }
}(jQuery,window));

代码不多,就不详细解析了(如果觉得代码有问题,望指正)。简单点说就是把劫持广告必须的全局js变量_pushshowjs_设定为不可被修改,只读。如果发现广告就清除。

放了代码,终于跟被劫持的广告说88了。

为什么说是笨办法?

因为这只是自欺欺人。其实劫持还是存在,并且被劫持了的js的加载顺序有可能会发生变化而导致错误,理想的办法还是要靠运维跟运营商去解决或使用https。

每个劫持的广告逻辑应该都差不多,但广告代码都会不同。所以我这个不一定会适用于其他的劫持广告。这只是一个思路,没办法之中的办法。

有大神有更好的解决办法,望指教。

以上这篇用js屏蔽被http劫持的浮动广告实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
Aug 05 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
Jquery中offset()和position()的区别分析
Feb 05 Javascript
jQuery实现灰蓝风格标准二级下拉菜单效果代码
Aug 31 Javascript
基于jQuery实现仿51job城市选择功能实例代码
Mar 02 Javascript
JS把内容动态插入到DIV的实现方法
Jul 19 Javascript
angularjs实现简单的购物车功能
Sep 21 Javascript
浅谈Webpack打包优化技巧
Jun 12 Javascript
微信小程序实现圆形进度条动画
Nov 18 Javascript
swiper Scrollbar滚动条组件详解
Sep 08 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
javascript将16进制的字符串转换为10进制整数hex
Mar 05 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
Aug 10 #Javascript
浅谈sass在vue注意的地方
Aug 10 #Javascript
详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
Aug 09 #jQuery
Angular 2.0+ 的数据绑定的实现示例
Aug 09 #Javascript
Ionic3实现图片瀑布流布局
Aug 09 #Javascript
JavaScript闭包和回调详解
Aug 09 #Javascript
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 #Javascript
You might like
php遍历数组的方法分享
2012/03/22 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
PHP查找一列有序数组是否包含某值的方法
2020/02/07 PHP
Code: write(s,d) 输出连续字符串
2007/08/19 Javascript
javascript面向对象的方式实现的弹出层效果代码
2010/01/28 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
JS简单编号生成器实现方法(附demo源码下载)
2016/04/05 Javascript
bootstrap table之通用方法( 时间控件,导出,动态下拉框, 表单验证 ,选中与获取信息)代码分享
2017/01/24 Javascript
vue父组件中获取子组件中的数据(实例讲解)
2017/09/27 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
js代码规范之Eslint安装与配置详解
2018/09/08 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
Python 装饰器深入理解
2017/03/16 Python
获取python文件扩展名和文件名方法
2018/02/02 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
使用Python和Scribus创建一个RGB立方体的方法
2019/07/17 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
基于Python爬虫采集天气网实时信息
2020/06/05 Python
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
市场营销专业毕业生自荐信
2013/11/02 职场文书
音乐器材管理制度
2014/01/31 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
2014年幼儿园工作总结
2014/11/10 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
护士工作心得体会
2016/01/25 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
php双向队列实例讲解
2021/11/17 PHP
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle