正在加载...
2012-12
25
发表于: Web前端 | 作者: | 目前已阅读: 14,592 次
标签:

话题背景:

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

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

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

}

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

error

 

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

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

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

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

Eg: http://zc.qq.com/index.html 里 <script src=”http://1.url.cn/b/js/10001/simple.js“></script>

 

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

 

code

 

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

 

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

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

比如:

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

2、hacker.com/index.html页面里通过script引入了这个http://qq.com/pay.html的话

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

 

应对办法:

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

a、设置 script 标签的 crossorigin

Eg:    <script src=”http://somremotesite.example/script.js” crossorigin></script>

b、设置javascript文件的HTTP头

Access-Control-Allow-Origin: http://qq.com

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

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

 

301

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

302

        message = errorMessage;

303

        line = lineNumber;

304

        sourceName = sourceURL;

305

    } else {

306

        message = “Script error.”;

307

        sourceName = String();

308

        line = 0;

309

    }

310

 

 

301

    message = errorMessage;

302

    line = lineNumber;

303

    sourceName = sourceURL;

 

参考文献:

1、webkit script error bug跟踪:https://bugs.webkit.org/show_bug.cgi?id=70574

2、webkit script error 代码细节:http://trac.webkit.org/browser/branches/chromium/648/Source/WebCore/dom/ScriptExecutionContext.cpp?rev=77122#L301

3、mozilla代码细节:http://mxr.mozilla.org/mozilla-beta/source/dom/base/nsJSEnvironment.cpp#316

4、中文参考:http://www.impng.com/web-dev/window-onerror.html

5、英文参考:http://stackoverflow.com/questions/5913978/cryptic-script-error-reported-in-javascript-in-chrome-and-fIrefox

 

 

: http://www.webryan.net/2012/12/something-about-window-onerror-script-error/

本文相关评论 - 才 4 条评论
2013-04-10 13:18:11

好文要顶,webkit问题目前还是无解么?(不自己修改内核的话)

[回复]

ryan 回复:

有啊有啊,新版本chrome做跨域声明就可以报出详细的出错信息

[回复]

2013-04-14 00:11:24

有啊有啊,新版本chrome做跨域声明就可以报出详细的出错信息

[回复]

2015-09-05 22:03:41

[…] window.error “Script error”问题跟进 […]

2015-12-22 09:29:23

百度我日你妈翻译公司翻译中国中国翻译翻译公司翻译公司翻译公司我们是最好的翻译公司百度我日你妈翻译公司我们最好翻译中国我们是翻译公司我们最好知道不

[回复]