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

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

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

“Script error.”,”Error loading script”,”Unexpected token <“

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

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

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

解决方法

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

考虑:

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

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

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

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

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

这意味着您没有从CDN托管脚本获得有关错误的有用信息,因此another change允许使用CORS用于CDN(或其他非同源)服务器以选择允许完整错误详细信息传递给一个恐怖处理程序.

We (Facebook) need a mechanism for disabling the window.onerror muting behavior implemented in 07003. Our static script resources are served on a CDN under a different domain from the main site. Because these domains differ we’re falling afoul of the x-domain logic that prevents us from gathering useful information about browser errors.

This “feature” has been widely enough adopted in in the wild (in Firefox and Webkit browsers) that the majority of uncaught exceptions we see in production Now have no actionable information in them.

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

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

不幸的是,在我的testing中,我发现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有一个three-year-old issue.我不会屏住呼吸.

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

相关文章

什么是深拷贝与浅拷贝?深拷贝与浅拷贝是js中处理对象或数据...
前言 今天复习了一些前端算法题,写到一两道比较有意思的题:...
最近在看回JavaScript的面试题,this 指向问题是入坑前端必须...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面