同源策略和 CORS - 有什么意义?

2023-11-30

我在理解同源策略和“解决”它的不同方法时遇到了一些困难。

显然,同源策略是作为一种安全措施而存在的,因此来自服务器/域的脚本无法访问来自另一服务器/域的数据。

同样清楚的是,有时,能够打破此规则是有用的,例如,混搭应用程序访问来自不同服务器的信息以构建所需的结果。而实现这一点的方法之一就是 CORS。

1)如果我没记错的话,CORS允许目标服务器对浏览器说“你可以从我这里获取数据/代码“通过在响应中添加一些标头。但是,如果这是正确的,则意味着恶意服务器可以添加此标头,并且浏览器将允许检索来自该服务器的任何可能有害的数据或代码。

2) 另一方面,我们有 JSONP,允许我们在没有启用 CORS 的情况下从服务器检索任意代码或数据,从而避免了 SOP 的主要目标。同样,即使 SOP 硬连线在浏览器中,能够管理 JSONP 的恶意服务器也能够注入数据或代码。

所以我的问题是:

第二个论证正确吗?浏览器是否必须接受内容是由服务器决定的吗? 第二个论证正确吗?再说一次,这不是由浏览器决定是否接受数据吗?

JSONP 不会让 SOP 变得毫无用处吗?

谢谢你启发我!!


这里需要注意的重要一点是,如果用户登录到网站http://example.com/和请求http://example.com/delete?id=1删除用户的帖子,那么下面的代码将删除用户的帖子:

<script src="http://example.com/delete?id=1" />

这称为 CSRF/XSRF 攻击(跨站点请求伪造)。这就是为什么大多数服务器端 Web 应用程序需要交易票据:而不是http://example.com/delete?id=1你必须做http://example.com/delete?id=1&txid=SomethingTheUserCannotGuess

现在以下攻击将不起作用:

<script src="http://example.com/delete?id=1" />

...因为它不包含 txid 参数。现在,让我们考虑一下如果可以使用 XmlHttpRequest 访问该站点会发生什么。在用户浏览器上运行的脚本可以在用户背后检索和解析http://example.com/pageThatContainsDeleteLink,提取txid然后请求http://example.com/delete?id=1&txid=SomethingTheUserCannotGuess

现在,如果 XmlHttpRequest 无法访问具有不同来源的站点,则尝试检索 txid 的唯一方法是尝试执行以下操作:

<script src="http://example.com/pageThatContainsDeleteLink" />

...但它没有帮助,因为结果是一个 HTML 页面,而不是一段 JavaScript 代码。因此,您可以包含以下内容是有原因的<script>来自其他站点但不通过 XmlHttpRequest 访问其他站点。

您可能有兴趣阅读以下内容:http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

这种攻击当时针对的是 Gmail,允许您从另一个网站上运行的 JavaScript 代码获取用户的邮件。这都说明WWW的安全模型是非常微妙的,考虑不周的。它是进化而来的,而不是经过精心设计的。

至于你的问题:你似乎认为服务器http://example.com/是恶意的。事实并非如此。使用我的答案的符号,http://example.com/是攻击目标的服务器,并且http://attacker.com/是攻击者的站点。如果http://example.com/开启了使用 JSONP 或 CORS 发送请求的可能性,确实它可能容易受到我刚才描述的 CSRF/XSRF 攻击。但这并不意味着其他网站会容易受到攻击。同样,如果http://attacker.com/提供了使用 JSONP 或 CORS 发送请求的可能性,攻击者的站点容易受到 CSRF/XSRF 攻击。因此,信息错误的服务器管理员可能会在自己的站点中打开漏洞,但这不会影响其他站点的安全。

Edit:提出了有效的评论。它解释了以下代码:

<script src="http://example.com/delete?id=1" />

...发送 GET 请求,然后example.com如果请求更改状态(例如删除重要内容),则应仅接受 POST 或 DELETE 请求。

确实如此,设计良好的站点不应根据任何 GET 请求更改状态。但是,这会发送一个 POST 请求:

<p>You just won $100! Click below to redeem your prize:</p>
<form action="http://example.com/delete" method="post">
  <input type="hidden" name="id" value="1" />
  <input type="submit" value="Redeem prize" />
</form>

在这种情况下,声称用户赢得 100 美元的代码可以嵌入到攻击者的站点中,并且它不会将 POST 请求发送到攻击者的站点,而是发送到受害者的站点。

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

同源策略和 CORS - 有什么意义? 的相关文章

随机推荐