-->

怎么看时,远程脚本被阻止返回什么(How to see what is returned when

2019-08-05 07:16发布

我使用谷歌托管的jQuery在我的web应用程序(//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js)作为错误诊断的一部分,我有抓住任何一个window.onerror处理器错误我不会在本地捕获并让服务器了解他们。

到目前为止好,但...有时候我喜欢这些错误:

“脚本错误”,“错误加载脚本”,“意外标记<”

我的假设是,谷歌CDN被阻止在这些情况下(无论何种原因)。 我有jQuery的本地备用,我是相当肯定的工作很好,但我想找出真实返回什么,这样我可以测试我的假设和可能得到一些用户的白名单的谷歌CDN上(如果它的公司的防火墙阻止它)。

但到目前为止,我一直无法弄清楚如何检索返回的内容。 无法检索的innerText脚本标记的,如果它是一个文件,可以这样做,因为跨域策略等Ajax请求

有没有人有关于如何这是有可能的任何想法?

Answer 1:

它仅仅是不可能得到一个引用的任何文件的内容<script>标记。 这是有原因的:这样做会允许你绕过XHR的同源策略。

考虑:

<script src="https://www.example.com/private/api/getAuthToken" id="s"></script>

如果你能访问respnse的文字,你可以这样做:

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

这显然是不好的。 因此,你永远不会允许读的通过带来一些内容<script>标记。

您的具体情况是由相对最近推出的复杂变化 ,其中在跨域脚本错误不报告给你的页面的任何有用的信息onerror处理程序。 (本质上说,这样做是为了修补一个信息披露的安全漏洞,它允许恶意网站来推断无论你登录到一些知名网站,除其他事项外)。

这意味着你得到关于从CDN托管脚本错误的有用信息,所以另一个变化是为了允许使用的CORS的CDN(或其他非同源)服务器,以便选择允许完全错误的详细信息传递一个onerror处理程序。

我们(Facebook)的需要禁用的机制window.onerror静音在实施行为#363897 。 我们的静态脚本资源正在从主站点不同的域送达CDN。 因为这些领域的不同,我们正在下降相抵触阻止我们收集有关浏览器错误的有用信息的X域逻辑的。

这种“功能”已经在野外(在Firefox和WebKit浏览器)通过了足够广泛,大多数我们看到生产未捕获的异常的,现在在他们不采取行动的信息。

crossorigin属性 (最初用于<img>允许您指定的资源应与CORS规则被加载。 它已被由Mozilla,实现WebKit的 ,和铬 。

<script src="http://example.com/xdomainrequest" crossorigin="anonymous"></script>

不幸的是你,在我的测试 ,我发现谷歌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检查会失败,你的脚本将收到擦洗错误的详细信息。

有一个三岁的老问题 ,使谷歌CDN服务器上CORS。 我不认为我的呼吸。


tldr:如果要有意义的错误信息,你必须承载所有的JavaScript自己,在同一个原点。



文章来源: How to see what is returned when a remote script is blocked