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

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

到目前为止这么好,但是……有时我会得到这样的错误:

“脚本错误。”,“加载脚本时出错”,“意外令牌<”

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

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

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

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

考虑:

  

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

 var stolenAuthToken = $('#s').text(); 

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

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

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

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

这个“特性”在野外(在Firefox和Webkit浏览器中)已被广泛采用,我们在生产中看到的大多数未被捕获的exception现在都没有可操作的信息。

crossorigin属性 (最初用于 )允许您指定应使用CORS规则加载资源。 它已由Mozilla, WebKit和Chrome实施 。

  

不幸的是,在我的测试中 ,我发现Google 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 ... 

请注意请求中存在Origin头(表示CORS请求),并且响应中缺少Access-Control-Allow-Origin头。 因此,即使您输入了crossorigin属性,CORS检查也会失败,并且您的脚本将收到清除的错误详细信息。

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


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