命名冲突引发的现网故障

一、前言

今天要介绍的命名冲突并不是系统内部的命名冲突,而是系统与浏览器插件之间的命名冲突。

二、现象描述:

通过查看运维同事上传到工单中的图片可得出这样的结论:用户页面无法加载JS、CSS,但是HTML可以成功解析。

三、故障分析过程,试图重现故障:

(1)、由于HTML可以成功解析,排除网络原因。

(2)、查资源服务器的ngnix访问日志,只有页面请求却没有JS、CSS的请求。猜测页面在请求加载静态资源的过程中出了问题。

(3)、可是邮箱加载静态资源都是使用统一的方法:loadScript、loadCss。如果出问题应该是所有用户都有问题,而不是部分用户。而且如果这两个方法有问题很容易就被测试同事发现,不可能带上生成线。

(4)、开始怀疑出问题的用户浏览器被挂马了。邮箱的页面被注入了恶意代码,导致静态资源加载失败。

四、登录用户电脑,验证故障分析过程:

(1)、安装抓包工具:HttpWatch。注意,这种情况Fiddler并不适用,因为Fiddler依赖.net framework框架,用户很可能没有安装。

(2)、注意用户有可能没有安装解压软件,所以如果需要向用户电脑安装软件的话,最好打包成zip格式。

(3)、登录邮箱,查看静态资源的请求过程。发现请求的地址不正确。查看源码,发现loadScript函数并没有异常。

(4)、在用户浏览器地址栏运行:javascript:alert(loadScript.toString());void(0); 发现弹出来的方法根本不是我们定义的方法。可以下结论:用户浏览器被注入了代码,并且执行优先级要高于我们自己定义的函数。

五、找出恶意插件:

(1)、打开用户浏览器的插件管理界面,用户通常都是IE浏览器,打开管理加载项界面:

(2)、依次禁用加载项,刷新页面,重新在用户浏览器地址栏运行:javascript:alert(loadScript.toString());void(0); 如果禁用某一加载项后可以输出我们自己脚本,就代表这个插件有问题。

(3)、最终定位出问题:用户安装了快播浏览器插件,该插件在浏览器侧注入了命名毫无特点的函数:loadScript

六、规避措施:

编码过程中不得已需要定义全局函数时,命名务必携带产品特性。避免被其他产品的浏览器插件覆盖。

七、结束语:

其实快播注入的并非是恶意代码,造成故障的根本原因其实是命名冲突。Martin Fowler在《重构:改善既有代码的设计》中专门介绍过函数的命名。感兴趣的同学可以翻阅这本书。绝对值得拥有。

时间: 2024-08-06 23:37:57

命名冲突引发的现网故障的相关文章

【项目管理】现网故障处理

PS:笔者是产品经理,因为工作须要兼岗项目经理,所以本文站在项目经理的角度来讨论怎样解决这个问题. 1. 工作案例 这段时间多个项目并行,每一个项目也有多个版本号须要管理.节奏非常快. 上周公布一个优化性能的版本号之后,本周一收到了非常多外网用户的反馈:"打开***游戏之后.居然弹出了网页广告,差点把机器卡死了". 经过跟外团(外部測试团队)进行沟通,得知是游戏版本号更新后导致的. 2. 现网故障 现网故障是指直接或者间接影响到用户正常使用产品. 比如:QQ无法登陆.百度首页打不开.支

JavaScript发展史,与JScript差别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突

文件夹: 1.JavaScript发展史 2.JavaScript与JScript差别 3.JavaScript引入方式 4.JavaScript基本数据类型及布尔值 5.JavaScript命名规范 6.JavaScript命名推荐 7.JavaScript解决命名冲突 1. JavaScript发展史 1.Netscape发明了JavaScript(1992年后) 1)出现JavaScript的原因(Netscape Navigator) * 网络的不断普及与推广,有庞大的用户量 * 因为当

JavaScript发展史,与JScript区别,引入方式,数据类型,命名规范,命名推荐,解决命名冲突

今天真机调试的时候莫名其妙遇到了这样的一个问题: This product type must be built using a provisioning profile, however no provisioning profile matching both the identity "iPhone Developer" and the bundle identifier..... 具体如下图所示: 十分蛋疼, 发现不管是从网上下的demo, 还是自己的过程.凡事真机测试的时候都

路由基础(三)静态现网用法

一.静态路由用法简介 静态路由的用法使用 1)静态路由优先级方式进行选路,静态路由搭配动态路由进行选路. 2)静态路由搭配SLA检测链路. 3)静态路由打通内外网. 4)静态路由发布路由. 静态路由在现网中看视简单,但是使用却很灵活,可以结合以上几种方式进行使用. 1.1静态路由优先级选路(动态路由结合) 在一个小型的网络中使用静态路由很常见,当网络慢慢变大,变复杂之后静态路由很多时候需要进行选路.常用静态优先级(管理性距离)选路方式. 网络分为两条线路,一条主用线路,一条备用线路进行. 主用线

CSS那些事!这个篇幅是我特意开的,不是因为帮助小菜之类的,而是在多人的团队配合中各种命名冲突的规范让人蛋疼

CSS那些事!这个篇幅是我特意开的,不是因为帮助小菜之类的,而是在多人的团队配合中各种命名冲突的规范让人蛋疼. css这个东西只要不是新的离谱都会写,但是每个人的命名风格,方法,都不同 有人喜欢驼峰,有人觉得-不错,有的人觉得_很方便,最后有的英文命名,有的干脆拼音....囧 http://www.cnblogs.com/LoveOrHate/category/682181.html 然后没有统一的格式,造成的结果...我爆炸了... 当然经常和团队合作的也就不用看了 这些文章我是专门找啊找,找

今天和组内一起写代码时碰到了一个关于命名冲突的问题,最后用js命名空间的方法解决的。

//第一步,首先创建一个全局变量,可以放在自己的js方法库中方便以后用,这个就是用来注册命名空间的方法. ns = function(namespace){ var arr = namespace.split('.');  //将传入的字符串如"com.test.lzn"以'.'隔开做成一个数组 var strNamespace = ""; //这个是为了保存每一步循环进去的包名 for(var i=0;i<arr.length;i++) { if(i!=0)

UPDATE 时主键冲突引发的思考【转】

假设有一个表,结构如下: root@localhost : yayun 22:59:43> create table t1 ( -> id int unsigned not null auto_increment, -> id2 int unsigned not null default '0', -> primary key (id) -> )engine=myisam; Query OK, 0 rows affected (0.00 sec) root@localhost

公司突然断网故障排查

记一次公司断网故障排查 本来大周一挺好的,刚坐在工位上不到半个小时,公司突然断网,此时,我是有点凌乱的! 下边是排查故障的过程 1,首先我看下本机电脑的IP地址,禁用启动,发现仍旧可以获取到IP地址,这代表DHCP分发是没问题的,因为是突然断网,代表着交换机路由器配置不可能出问题 2,接着我带着笔记本进入机房,看了下光猫,光猫状态正常,然后看了下路由器,路由器是H3C的,有web管理界面,进入web管理界面,发现IP地址状态也是正常的. 4,接着给公司网络运营商打电话,他说是他们那边的问题,有个

多个JavaScript库使用 $ 号的命名冲突问题

多个JavaScript库使用 $ 号的命名冲突问题: 1. 为解决这个问题,jQuery 提供了一个 jQuery.noConflict() 方法,调用该方法可以把对 $ 标识符的控制权让渡给其他库.使用 jQuery.noConflict() 方法的一般模式如下:        <script>            jQuery.noConflict(); // 让出 $ 标识符的控制权        </script> 2. 如果想要在 .ready() 方法中使用 $ 标