记一次奇葩的Js劫持事件

最近,项目突发状况,之前开发的一个手机端APP内嵌H5页面突然异常。现象是刷新页面后,有很大概率页面卡死在数据加载阶段。于是联系App开发人员,出调试包。开始调试。

开始调试后,首先发现页面加载时发送了一个奇怪的请求-http://8.525cm.com/v2/v.php?id=105,返回还是404,于是猜测被运营商DNS劫持,篡改了我们的HTML(话说运营商是联通啊啊啊,开始完全不相信,因为自己孤陋寡闻,只见过小城市的电信干这种事,而我大北京的联通应该不至于吧),而我们的页面确实并未开启HTTPS。嗯嗯,查HTML,发现在head部分确实被插入了一个script标签,如下图:

看来问题找到了。

进一步思考,发现这个原因仍然无法解释为什么我们的页面会卡死在加载阶段,理论上这种劫持不会影响原页面的的功能啊。看来仍然需要进一步调查。

页面卡死一般会有两种情况,某些请求没有返回,一直在Pending状态,或者JS的执行出错了。分别查看网络请求和控制台输出,果然是JS执行出错了。具体查看出错信息,发现是我们依赖的一个JS库没有执行。这就很奇怪了,在网络请求中该JS库是正常返回的。再次查看网络请求确认,发现该JS请求竟然不是我们所依赖的库,竟然被替换成了下面这份鬼样子:

高潮来了,让我们来审查一下这段神奇的代码。首先,它会试图去找一个id为mck0的dom,找到了就什么都不干。如果找不到,嘿嘿,它会向DOM添加两个JS节点(使用appendChild()API),一个是之前被域名劫持掉的JS,自作聪明的作者企图通过这这种方式掩盖他的罪行;另一个就是真正干坏事的请求-8.525cm.com/v2/v.php?id=105。但是百密一疏的是作者居然使用了appendChild,JS的加载顺序被他改掉了,正巧项目中的其它JS依赖了这个被替换掉的JS,于是其它JS在加载时妥妥的报错了,页面卡死也就不足为奇了。

进一步实验还发现,如果整个站点起在HTTPS下面,并且将所有JS也全部托管于HTTPS下,该伪造的JS并不会聪明的分辨协议,还是使用了一个HTTP的JS来还原之前被劫持掉的HTTPS JS,这样整个JS都会因为浏览器的安全策略而加载失败。也就是说如果我们的站点是在HTTPS下的,那么站点中一定会有一个JS因为劫持而加载失败,导致页面出现问题。

通过whois反查,得到如下信息:

貌似域名持有者是中国万网,阿里旗下公司,我们静待大公司如何回应吧。

回到我们的项目,被劫持的JS是托管在七牛的CDN上,并且通过HTTPS访问,所以已经可以断定,七牛分配给我们的域名已经被运营商劫持掉了。现在我们正在联系七牛的客服积极处理中。进一步的进展我会及时更新在这篇文章中。

时间: 2024-10-10 07:33:10

记一次奇葩的Js劫持事件的相关文章

js阻止浏览器、元素的默认事件与js阻止事件冒泡、阻止事件流

嵌套的div元素,如果父级和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下js阻止默认事件与js阻止事件冒泡示例,大家参考使用吧 1. event.preventDefault();  -- 阻止元素的默认事件.注:a元素的点击跳转的默认事件 , button,radio等表单元素的默认事件 , div 元素没有默认事件 例: 复制代码代码如下: <a href="http://www.baidu.com" target="_bl

Js 冒泡事件阻止

原文:Js 冒泡事件阻止 1. 事件目标 现在,事件处理程序中的变量event保存着事件对象.而event.target属性保存着发生事件的目标元素.这个属性是DOM API中规定的,但是没有被所有浏览器实现 .jQuery对这个事件对象进行了必要的扩展,从而在任何浏览器中都能够使用这个属性.通过.target,可以确定DOM中首先接收到事件的元素(即实际被单击的元素).而且,我们知道this引用的是处理事件的DOM元素,所以可以编写下列代码:$(document).ready(function

用js onselectstart事件鼠标禁止选中文字

IE&&Chrome中适用此方法 document.onselectstart=function(){return false;} onselectstart是防止内容被选中默认状态是true <body onselectstart=return(event.srcElement.type=='text')> 选不中 <input type="text" name="" value="来选吧"> </

JS(原生)事件委托:为动态创建的节点绑定事件

项目开发中经常需要为动态创建的节点绑定事件, 比如需要创建一个动态列表:在li的数量非常少的时候,为每一个li绑定事件不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(假设),为每个li绑定事件就会对页面性能产生很大的影响.当有大量元素需要绑定相同事件的时候可采用事件委托,将在目标元素上要处理的事件委托给父元素或者祖先元素 优点    事件委托对于web应用程序的性能有如下几个优点:    1.需要管理的函数变少了    2.占用的内存少了    3.javascrip

Atitit. &#160;Js 冒泡事件阻止&#160;事件捕获&#160;&#160;&#160;事件传递 &#160;事件代理

Atitit.  Js 冒泡事件阻止 事件捕获   事件传递  事件代理   1. 事件冒泡1 2. 事件捕获1 3. 同时支持了事件捕获阶段和事件冒泡阶段ddEventListener的第三个参数1 4. 事件代理3 5. 冒泡还是捕获?3 6. Js 冒泡事件阻止3 6.1. 返回false5 7. 事件冒泡 使处理函数有范围较大的触发面积,在“拖拽效果”脚本中是必须的5 8. refe6 8.1.1. 浅谈事件冒泡与事件捕获 - ac黄博客精选 - SegmentFault6   1. 事

原生js阻止事件冒泡代码实例

原生js阻止事件冒泡代码实例:关于什么是事件冒泡这里就不多介绍了,可以参阅javascript事件冒泡简单介绍一章节,任何现象都是双刃剑,有时候利用事件冒泡能够带来便利性,但是有时候也会带来不便,下面就通过带来实例介绍一下如何阻止事件冒泡现象.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" conte

JS之事件监听

一 如果事件监听类似于如下写法,则最终只会执行最后一个事件监听,其他监听都会被覆盖掉. window.onload=funtion(){console.log(1);}; window.onload=funtion(){console.log(2);}; window.onload=funtion(){console.log(3);}; //最终只会输出:"3" 二 如果事件监听类似于如下写法,则每个事件监听都会被执行,其他监听都不会被覆盖掉. --是否冒泡或捕获都不会影响输出结果的次

JS常见事件以及函数

1.js enter键激发事件 document.onkeydown = function (e) {            if (!e) e = window.event;            if ((e.keyCode || e.which) == 13) {                $("#btnSubmit").click();            }        } 2. JS常见事件以及函数

Js冒泡事件和捕获事件

js中冒泡事件和捕获事件: 冒泡事件:冒泡事件是从里向外,即是从被绑定元素开始一直向外到达页面的所有祖先元素都会被触发,这 一过程被称为事件冒泡.这个事件从原始元素开始一直冒泡到DOM树的最上层 捕获事件:捕获事件是从页面的最上层到被绑定元素都会触发. IE只支持事件冒泡,不支持事件捕获 冒泡事件和捕获事件的方向是相反的. 形式如下图所示: 一般为浏览器中的元素绑定事件有2种方式: 一.直接在页面元素中进行绑定,此方式采用的是冒泡排序,如: <div id="eventExample&qu