admin管理员组

文章数量:1516870


话题背景:

为了提高web开发质量,我们通常会在web前端页面里注册window.onerror事件,然后将统一的脚本错误信息发送到服务器汇总和统计,每天计算出错误排行榜,以方便我们跟踪和解决问题。

window.onerror = function(msg,url,line,row){

$.badjs(msg,url,line,row,上报ID); //创建图片请求,并加上一些前台需要搜集的信息

}

但是最近统计发现有大量的Script error信息,排 行第一且没有给出具体的错误内容。

出现“Script error”的场景和条件:

1、通过window.onerror注册监听脚本错误事件

2、浏览器:Firefox、Chrome、Safari、Opera等浏览器历史版本

3、页面内使用了script标签引入,非同域的JS或者HTML;且出现脚本错误。

Eg: 里 <script src=” “></script>

出现“Script error”的原因(只列举webkit;ff同理):

不难看出,在出发脚本错误提示的时候,通过secureityOrigin()里的方法判断了是否是同源可用。不是的话,就生成massage为“Script error”,错误行号为0的信息。

浏览器限制同源脚本错误背景分析:

本质上是出于安全考虑。因为script引入文件内容的时候是忽略文件本身的MIME声明,且是允许跨域请求的。这里如果不屏蔽掉跨域情况下的错误信息,很可能会给黑客提供一个攻击通道。

比如:

1、qq.com有个页面pay.html(在有登录态的情况下)会有两种显示内容:“您当前的余额为0元”或“您当前的余额为100元”

2、hacker.com/index.html页面里通过script引入了这个

那么黑客就可以在hacker.com上获取到错误:“Uncaught ReferenceError: 你的余额为100 is not defined| ”。此时黑客已经间接的获取到了他想要的信息,那么黑客可以通过遍历等方式将信息最大化。

应对办法:

目前Firefox 13+,Chrome 2012.12.9号之后版本均已经支持:通过设置同源策略来显示错误信息。

a、设置 script 标签的 crossorigin

Eg:    <script src=” ” crossorigin></script>

b、设置javascript文件的HTTP头

Access-Control-Allow-Origin:

对于使用CEF(Chromium Embedded Framework)的项目可以直接更新代码或手动修改代码:

Source/WebCore/dom/ScriptExecutionContext.cpp ,301-309,

301

if (securityOrigin()->canRequest(targetUrl)) {

message = errorMessage;

line = lineNumber;

sourceName = sourceURL;

} else {

message = ”Script error.”;

sourceName = String();

line = 0;

}

301

message = errorMessage;

line = lineNumber;

sourceName = sourceURL;

本文标签: 出现信息事件