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

2024-04-28

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

到目前为止一切顺利,但是......有时我会遇到这样的错误:

“脚本错误。”、“加载脚本时出错”、“意外的标记

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

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

有谁知道这如何可能吗?


根本不可能获取引用的任何文件的内容<script>标签。这是有充分理由的:这样做可以让您绕过 XHR 的同源政策。

考虑:

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

如果您可以访问响应的文本,您就可以执行以下操作:

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

这显然很糟糕。因此,您永远不允许阅读由<script> tags.

最近推出的一项措施使您的具体情况变得复杂change https://bugzilla.mozilla.org/show_bug.cgi?id=363897跨源脚本中的错误不报告any对您的页面有用的信息onerror处理程序。 (本质上,这样做是为了修补信息泄露安全漏洞,该漏洞允许恶意网站推断您是否登录了某些知名网站等。)

这意味着您无法从 CDN 托管的脚本中获得有关错误的有用信息,因此另一个改变 https://bugzilla.mozilla.org/show_bug.cgi?id=696301是为了允许使用CORS https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS让 CDN(或其他非同源)服务器选择允许将完整的错误详细信息传递给onerror处理程序。

我们(Facebook)需要一种机制来禁用window.onerror静音行为实施于#363897 https://bugzilla.mozilla.org/show_bug.cgi?id=363897。我们的静态脚本资源在与主站点不同的域下的 CDN 上提供。由于这些域不同,我们与 x 域逻辑发生了冲突,该逻辑阻止我们收集有关浏览器错误的有用信息。

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

The crossorigin属性 https://developer.mozilla.org/en-US/docs/HTML/Element/img#attr-crossorigin(最初是为了<img>) 允许您指定应使用 CORS 规则加载资源。它已由 Mozilla 实施,WebKit https://bugs.webkit.org/show_bug.cgi?id=70574, and Chrome https://code.google.com/p/chromium/issues/detail?id=159566.

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

对你来说不幸的是,在我的testing http://jsfiddle.net/josh3736/jm2JU/,我发现Google CDN确实not发送 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 检查将失败,并且您的脚本将收到已清理的错误详细信息。

有一个三年前的问题 http://code.google.com/p/google-ajax-apis/issues/detail?id=427在 Google CDN 服务器上启用 CORS。我不会屏住呼吸。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何查看远程脚本被阻止时返回的内容 的相关文章

  • 服务器返回网页 404,但页面在浏览器中显示正常 - 为什么?

    一个奇怪的网页横亘在我面前 作为一名开发人员 我必须解开这个谜团 在任何浏览器中访问网页时 一切似乎都很正常 网页按预期显示 但是当查看控制台时 服务器实际上返回了 404 状态代码 那么浏览器为什么要渲染页面呢 查看正文显示返回了有效的
  • 在模态上自动滚动引导模态('show')

    我有一个用于评论的引导模式 评论表格附加在评论列表的底部 我希望此模式在打开时滚动到列表底部 如果有超过 2 或 3 条评论 我已经安装了这个幻灯片插件 http jesseprice com jquery slide to plugin
  • 如何将这段 javascript 代码重写为 C++11?

    这是我在 Javascript Definitive Guide 中看到的 javascript 闭包代码 我想把它写成C 11 var uniqueID1 function var id 0 return function return
  • 如何处理 React JSX 中的长类名?

    假设我在 React JSX 中渲染这个组件 render return h1 Some text h1 这些类触发我的 JS linter 的行太长 而且很难阅读 怎样才能分开长className将 React 组件中的属性分成多行而不破
  • 启动 jQuery UI 选项卡,没有选项卡处于活动状态且所有面板都隐藏

    我在用着jQuery UI 选项卡 http jqueryui com tabs 在一个项目中 我想知道是否有一种简单的方法可以在文档加载时隐藏所有面板 直到单击选项卡为止 默认情况下 jQuery UI 以激活的选项卡和可见的相应面板开始
  • 如何从 WinRT StreamSocket 读取所有可用数据并清空 inputStream?

    我想在向套接字写入新数据之前读取当前正在等待套接字的所有数据 WinRT中的读取方法都是异步的 所以我不能简单地while直到套接字为空 由于我确实想丢弃套接字上的数据 因此我不想使用读取器 而是直接从套接字读取数据IInputStream
  • Javascript 警报/消息框中的欧元符号或其他实体

    有谁知道我如何在 javascript 警报窗口中显示欧元或其他 html 实体 alert u20AC HTML 实体字符查找 http leftlogic com lounge articles entity lookup
  • jquery 中 DOM 元素的手动垃圾回收是否可以提高浏览器性能?

    在性能范围内 删除不再需要的元素是否有意义 或者浏览器是否对代码中未进一步引用的 dom 元素执行自动垃圾收集 some element fadeOut 1000 function el el remove lt does this mak
  • 如何使用 javascript 禁用组合键?

    I would like to disable view source shortcut key for IE using JavaScript To disable Ctrl C I am using the following func
  • jQuery .nothas?

    有没有办法做相当于 nothas jQuery 中的选择器 例如 如果我想添加一个TBODY to all TABLE如果元素还没有 那么最好做这样的事情 TABLE nothas TBODY append tbody tbody 如果这可
  • Kotlin JavaScript 到 TypeScript 定义文件

    我已经找到了ts2kt 库 https github com Kotlin ts2kt这将从任意位置创建 Kotlin 头文件 d ts文件 但是 我想朝相反的方向走 我想构建一个可以编译为 JavaScript 的 Kotlin 库 但我
  • 图像未显示在从 HTML 创建的 PDF 上

    我想动态创建 PDF 这意味着我将从 Google Drive 获取文件 然后将它们放入 HTML 代码中 并尝试从中创建 PDF 一切工作正常 除了图像没有显示 我现在正在做的是 从 HTML 字符串创建 HtmlOutput 获取该 H
  • ParseFromString 在 IE 中抛出错误,但在 Chrome 中不会抛出错误

    我正在使用传单的 KML 插件 该插件在 Google Chrome 中运行良好 然而 在 IE 中 它会在以下代码中引发错误 parser new DOMParser console log url outputs path to kml
  • 更改哈希值而不触发 hashchange 事件

    我使用哈希来动态加载内容 为了使后退按钮正常工作 我正在捕获哈希更改 然而 有时我需要更改哈希值而不触发哈希更改函数 例如 当页面重定向到服务器端时 我需要在内容返回后更新哈希值 我想出的最佳解决方案是取消绑定 hashchange 事件
  • “x modulo y”的结果是什么?

    引用 ECMAScript 规范第 5 2 节 符号 x modulo y y 必须是有限且非零 计算 值 k 与 y 具有相同的符号 或零 使得 abs k 因此 如果 y 为正 则 x modulo y 的结果 k 为正 无论 x 的符
  • 我应该增强客户端上的 Jquery Mobile 元素还是发送带有 data-enhance="false" 的增强标记?

    我有一个产品搜索 我正在发送回结果 每个结果都包含两个按钮 JQM 控制组 我一次发送 24 条记录 因此需要增强 24 个控制组 如下所示 div class submitButton linkBox div
  • 如何始终将焦点保持在画布上?

    我一直在这个论坛寻找解决方案 但尚未找到 无论我在页面上的哪个位置单击 我都需要始终将焦点放在画布元素上 我有几个按钮 在每个 onclick 事件中我写 document getElementById canvas focus 这确实有效
  • 使用 JQueryUI Autocomplete 和 Meteor 的规范方法

    使用 Meteor 我想了解使用 JQuery UI 自动完成处理大量服务器端数据的最有效方法 我有两个工作提案 想听听关于差异的意见 以及是否有更好的方法来做同样的事情 使用发布 订阅 Server Meteor publish auto
  • 在哪里放置资源特定逻辑

    您能帮我考虑在 AngularJS 中将资源 服务 特定的业务逻辑放置在哪里吗 我觉得在我的资源上创建一些类似模型的抽象应该很棒 但我不确定如何做 API调用 gt GET customers 1 lt first name John la
  • 如何循环遍历颜色数组以更改按键背景(按下/向下)

    互联网 如果这与其他人没有什么关系 请原谅我 但我会将其留在这里 以防这是一个有效的问题 我正在尝试创建一个文本区域字段 其中用户每次按下键 a z 都会触发背景颜色更改 在数组中列出 我一直在用 JQuery 做这件事 我想我已经很接近了

随机推荐