开发者社区> fundebug> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Script error.全面解析

简介: 一些用户向我们反馈,Fundebug的JavaScript监控插件抓到了很多Script error.,然后行号和列号都是0...这就很尴尬了。 今天,我们来详细地解析一下Script error.,后续我们还会深度测试并且提供解决方法。
+关注继续查看

一些用户向我们反馈,FundebugJavaScript监控插件抓到了很多Script error.,然后行号和列号都是0...这就很尴尬了。

img_38d2c46ea10c81ac4037d8c6ab56e17a.png

今天,我们来详细地解析一下Script error.,后续我们还会深度测试并且提供解决方法。

同源策略 (Same origin policy)

解释Script error.之前,我们先简单聊聊同源策略。摘自MDN - Same-origin policy:

Two pages have the same origin if the protocol, port (if one is specified), and host are the same for both pages.

所谓同源,就是指两个页面具有相同的协议、端口和主机(域名)。通过第三方加载的JavaScript脚本是不同源的。下面的表格简单列出了和https://fundebug.com/app.js是否同源的文件:

网址 是否同源 原因
https://fundebug.com/vendor.js
http://fundebug.com/vendor.js 协议不同
https://fundebug.com:8001/app.js 端口不同
https://docs.fundebug.com/nav.js 子域名不同
https://kiwenlau.com/totop.js 域名不同

没有同源策略的话,将会怎样?摘自同源策略详解及绕过 - FreeBuf

假设你已经成功登录Gmail服务器,同时在同一个浏览器访问恶意站点(另一个浏览器选项卡)。没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说阅读你的私密邮件,发送虚假邮件,看你的聊天记录等等。 如果将Gmail替换为你的银行帐户,问题就大条了。

为啥出现Script error. ?

为了提升网站的访问速度,我们通常都会将静态资源文件(css, image, javascript)放在第三方CDN。当这些从第三方加载的JavaScript脚本执行出错,因为违背了同源策略, 为了保证用户信息不被泄露,错误信息不会显示出来,取而代之只会返回一个Script error.

暴露错误信息会怎样呢?摘自(Cryptic “Script Error.” reported in Javascript in Chrome and Firefox):

假想你不小心访问了一个恶意网站,网页里面偷偷放入了一段JavaScript脚本 <script src="cbcc.com/index.html">,这段脚本指向你使用的某银行网站首页。虽然脚本会执行失败,但是错误信息却有可能泄露你的信息。如果你已经登录过该银行网站并且处于登录状态,那么错误信息可能为'欢迎你 ....' is undefined;如果你没有登录,那么错误信息可能是'请登录...' is undefined。 然后黑客就可以根据这些信息确定你使用的银行网站,并且伪造一个钓鱼网站来骗取钱财。

源码

webkit源码如下:

bool ScriptExecutionContext::dispatchErrorEvent(const String& errorMessage, 
    int lineNumber, 
    const String& sourceURL)
{
    EventTarget* target = errorEventTarget();
    if (!target)
        return false;
    ...
    if (securityOrigin()->canRequest(targetUrl)) {
        message = errorMessage;
        line = lineNumber;
        sourceName = sourceURL;
    } else {
        message = "Script error.";
        sourceName = String();
        line = 0;
    }
    ...
}

可知,浏览器会判断所加载的资源url是否同源(securityOrigin()->canRequest(targetUrl)),如果不同源,则将错误消息隐藏,赋值为Script error., 并且将行号设为0.

因此,如果我们从第三方CDN服务加载资源,如果出错的话,那么我们将只能看到Script error.

错误复现

我们用一个简单的例子测试一下。下面是index.html,我们使用onerror来捕获错误。

<!DOCTYPE html>
<html>
<head>
    <title>Test Script error</title>
    <script type="text/javascript">
      window.onerror = function(errorMessage, scriptURI, lineNumber, columnNumber, error){
        console.log(errorMessage);
        console.log(scriptURI);
        console.log(lineNumber);
        console.log(columnNumber);
        console.log(error);
      }
    </script>
    <script type="text/javascript" src="./scripterror.js"></script>
</head>
<body>
</body>
</html>

scripterror.js中抛出一个Error对象:

throw new Error('Hello, Fundebug');

使用的http-server挂载文件,打开http://localhost:8080/index.html

在Chrome浏览器控制台下,可以看到详细的出错信息:

img_a7f28e8e918c905d8a8a0b910aea317a.png

为了复现Scrpt error., 将scripterror.js放到我在coding.net的个人项目下面:

<!DOCTYPE html>
<html>
<head>
    <title>Test Script error</title>
    <script type="text/javascript">
      window.onerror = function(errorMessage, scriptURI, lineNumber, columnNumber, error){
        console.log(errorMessage);
        console.log(scriptURI);
        console.log(lineNumber);
        console.log(columnNumber);
        console.log(error);
      }
    </script>
    <script type="text/javascript" src="http://coding.net/u/stefanzan/p/stefanzan/git/raw/coding-pages/public/js/src/scripterror.js"></script>
</head>
<body>
</body>
</html>

运行http-server, 结果如下:

img_bf2e2dd9f4e533a7e279040c62ab01e1.png

因为违背同源策略,这时只能拿到Script error.

总结

本文介绍了Script error.的由来,并提供了一个简单的实例来演示什么情况下出现Script error.。接下来,我们将对Script error进行深度测试并提出解决方法

欢迎加入我们官方QQ群“全栈BUG监控交流”622902485

img_84818513ba0ecf26b3f58270732d90f2.png

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/04/05/understand-script-error/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
未解决:运行EtherCalc出错:Error: Cannot find module 'zappajs'
未解决:运行EtherCalc出错:Error: Cannot find module 'zappajs'
0 0
Refused to execute script from 'http://127.0.0.1:8004/login' because its MIME type ('text/html') ...
Refused to execute script from 'http://127.0.0.1:8004/login' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled. Refused to execute script …”,为什么会被拒绝执行呢?想到可能是权限的控制问题,亦即是 Spring Security 的静态资源访问配置问题。
1550 0
【error】jQuery ajax请求错误返回status 0和错误error的问题 : ajax error:{"readyState":0,"status":0,"statusText":"error"}
【error】jQuery ajax请求错误返回status 0和错误error的问题 : ajax error:{"readyState":0,"status":0,"statusText":"error"} 异常描述: 第一次ajax,后台都没问题,但是却进入error方法,错误码0,错误信息error。
2885 0
JS function document.onclick(){}报错Syntax error on token "function", delete this token - CSDN博客
原文:JS function document.onclick(){}报错Syntax error on token "function", delete this token - CSDN博客 JS function document.
921 0
PHP Fatal error: Class 'DOMDocument' not found
PHP Fatal error:  Class 'DOMDocument' not found 给PHP添加 xml模块: yum install php-xml   如果是PHP5,则用 yum install php55w-xml
659 0
四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现
原文:四种常见的提示弹出框(success,warning,error,loading)原生JavaScript和jQuery分别实现  虽然说现在官方的自带插件已经有很多了,但是有时候往往不能满足我们的需求,下面我简单介绍一些 常见的四种提示弹出框(success,loading,error,w...
1035 0
Asp.net中用来代替Response.Write("<script>alert(&#39;错误信息&#39;);</script>");
如果直接在页面中使用Response.Write("alert('错误信息');"); 点击确定以后,可能会造成页面“错位”;  把代码封装到一个类中(就叫PageHelper.cs吧),在其他页面也可以方便的调用;  例如在其他页面调用:Page.Alert(this,"错语信息"); 效果和上面的代码是一样的,要说不同点吧?就是这个写法比上面的完美好多。
489 0
+关注
fundebug
一行代码搞定BUG监控!
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载