HTTP 访问控制 (CORS) 可以阻止其他域运行我的脚本吗?
Posted
技术标签:
【中文标题】HTTP 访问控制 (CORS) 可以阻止其他域运行我的脚本吗?【英文标题】:Can HTTP Access Control (CORS) prevent other domains from running my scripts? 【发布时间】:2017-07-04 16:56:34 【问题描述】:我知道默认情况下,其他域上的 html 页面无法访问我的图像、视频。他们只能展示他们。但遗憾的是,他们仍然可以运行我的脚本。如果我的脚本将一些变量暴露给全局范围,那么内部逻辑可能会被其他人知道。
我有一个其他人无法访问的私人网站。只有我可以通过向服务器发送 Cookie 中的令牌来访问它。如果 Cookie 中不包含令牌,则每个请求都会导致 500 服务器错误响应。这是安全的,因为一切都在 HTTPS 上。
但不幸的是,我发现这在我自己的机器上不是很安全,因为在我访问了我的站点然后访问了一个恶意站点之后,这个恶意站点可以使用以下方法来运行我的脚本:
<script src="https://my-website.com/main.js"></script>
这是因为我机器上的网站 Cookie 将作为第 3 方 Cookie 发送到我的服务器。
如何预防? access-control-allow-origin
可以吗?
附:我不想在浏览器设置中禁用所有 3rd-party cookie。 Cookie 的SameSite
也没有意义,因为现在只有 Chrome 支持它。
【问题讨论】:
【参考方案1】:有许多可以想象的方法来阻止其他网站使用 script
元素在他们的网站中运行来自您网站的脚本副本,但 CORS 不是其中之一。
浏览器是执行同源策略 (SOP) 的地方,而浏览器是阻止在 Web 应用程序中运行的 javascript 使用来自跨域请求的响应的地方。
但当 Web 应用程序使用 script
元素嵌入一些 JavaScript 时,浏览器不使用 SOP/CORS。具体来说,浏览器不会检查脚本是否来自其他站点,并带有 Access-Control-Allow-Origin
标头,这是整个 CORS 协议的基础。
所以 CORS 绝对不能解决您似乎想要解决的问题。
但不幸的是,我发现这在我自己的机器上不是很安全,因为在我访问了我的站点然后访问了一个恶意站点之后,这个恶意站点可以使用以下方法来运行我的脚本:
<script src="https://my-website.com/main.js"></script>
但是,如果该站点以这种方式将您的脚本嵌入到他们的脚本中,那么它会在 他们的 源中运行,而不是您的。它作为一个受信任的脚本在那里运行,具有与他们自己编写的任何脚本相同的所有权限。
在这种情况下,另一个站点是承担安全风险的站点 - 因为您可以随时更改您的 https://my-website.com/main.js
脚本以在他们的站点上执行您想要的任何操作。
也就是说,通过以这种方式嵌入您的脚本,其他站点会为您的脚本提供完全受信任的编程访问权限,以便在其整个源头执行任何它想做的事情——为您提供 XSS 机会。
【讨论】:
其他网站是否信任我的脚本是另一回事。所以,对于我的问题,似乎我可以在服务器端检测到“Referer”标头(因为它不能在浏览器中任意修改)?另一种方法可能是强制请求在查询字符串中包含令牌? 你不能依赖Referer。用户可以选择让他们的浏览器不发送它kb.mozillazine.org/Network.http.sendRefererHeader(并且也禁止document.referrer),还有很多其他情况它可能是空的***.com/questions/6880659/…并且在支持Referer Policy的浏览器中,作者也可以导致Referer标头为空***.com/questions/6880659/…以上是关于HTTP 访问控制 (CORS) 可以阻止其他域运行我的脚本吗?的主要内容,如果未能解决你的问题,请参考以下文章
被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP OK 状态
请求被 CORS 阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态
如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?
domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态