如何查看阻止远程脚本时返回的内容

Pyr*_*979 6 javascript browser jquery cdn google-cdn

我在我的webapp中使用谷歌托管的jQuery(//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js)作为错误诊断的一部分,我有一个window.onerror处理程序,可以捕获任何错误我没有在本地捕获并让服务器知道它们.

到目前为止一切都很好,但是......有时候会出现这样的错误:

"脚本错误.","加载脚本时出错","意外令牌<"

我的假设是谷歌CDN在这些情况下被阻止(无论出于何种原因).我确实有一个jQuery的本地回退,我相当确定它运行良好,但我想知道返回什么,以便我可以测试我的假设,并可能将这些用户列入Google CDN的白名单(如果是公司防火墙阻止它).

但到目前为止,我还没有弄清楚如何检索返回的内容.如果它是文件,则无法检索SCRIPT标记的innerText,因跨域策略而无法执行ajax请求等.

有没有人对如何做到这一点有任何想法?

jos*_*736 11

它根本无法获取<script>标记引用的任何文件的内容.这是有充分理由的:这样做可以让你绕过XHR的同源策略.

考虑:

<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>
Run Code Online (Sandbox Code Playgroud)

如果您可以访问respnse的文本,您将能够执行此操作:

var stolenAuthToken = $('#s').text();
Run Code Online (Sandbox Code Playgroud)

那显然很糟糕.因此,您永远不会被允许阅读<script>标签带来的内容.

最近引入的更改会使您的特定情况变得复杂,其中跨源脚本中的错误不会向页面处理程序报告任何有用的信息onerror.(基本上,这是为了修补信息泄露安全漏洞,允许恶意网站推断您是否登录到某些知名网站等.)

这意味着您没有从CDN托管脚本获得有关错误的有用信息,因此进行了另一项更改以允许将CDS用于CDN(或其他非同源)服务器以选择允许完整错误详细信息通过到onerror处理程序.

我们(Facebook)需要一种机制来禁用#363897中window.onerror实现的静音行为.我们的静态脚本资源在与主站点不同的域下的CDN上提供.由于这些域名不同,我们正在违反x域逻辑,这阻止我们收集有关浏览器错误的有用信息.

这个"特性"已经被广泛采用(在Firefox和Webkit浏览器中),我们在生产中看到的大多数未被捕获的异常现在都没有可操作的信息.

crossorigin属性(最初用于<img>)允许您指定应使用CORS规则加载资源.它已由Mozilla,WebKitChrome实施.

<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script>
Run Code Online (Sandbox Code Playgroud)

不幸的是你,在我的测试,我发现谷歌CDN并没有发送CORS标头.

GET http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js HTTP/1.1
Host: ajax.googleapis.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://fiddle.jshell.net/josh3736/jm2JU/show/
Origin: http://fiddle.jshell.net
Pragma: no-cache
Cache-Control: no-cache

HTTP/1.1 200 OK
Vary: Accept-Encoding
Content-Type: text/javascript; charset=UTF-8
Last-Modified: Tue, 13 Nov 2012 19:53:02 GMT
Date: Wed, 02 Jan 2013 22:54:25 GMT
Expires: Thu, 02 Jan 2014 22:54:25 GMT
X-Content-Type-Options: nosniff
Server: sffe
Content-Length: 93637
X-XSS-Protection: 1; mode=block
Cache-Control: public, max-age=31536000
Age: 169036

...
Run Code Online (Sandbox Code Playgroud)

请注意Origin请求中是否存在标头(表示CORS请求),并且Access-Control-Allow-Origin响应中没有标头.因此,即使您放置该crossorigin属性,CORS检查也会失败,并且您的脚本将收到清除的错误详细信息.

在Google CDN服务器上启用CORS 存在一个为期三年的问题.我不会屏住呼吸.


tldr: 如果您需要有意义的错误消息,则必须在同一个源上自己托管所有JavaScript.