same-origin 政策和 CORS - 有什么意义?
same-origin policy and CORS - what's the point?
我在理解 same-origin 政策和 "workaround" 政策的不同方式时遇到了一些困难。
很明显 same-origin 策略作为一种安全措施存在,因此来自 server/domain 的脚本无法访问来自另一个 server/domain.
[= 的数据15=]
同样清楚的是,有时打破此规则很有用,例如,混搭应用程序访问来自不同服务器的信息以构建所需的结果。其中一种方法是 CORS。
1) 如果我没记错的话,CORS 允许 目标服务器 对浏览器说“你可以从我这里拿走 data/code" 通过在响应中添加一些 headers。但是,如果这是正确的,这意味着恶意服务器只需添加此 header 并且浏览器将允许检索来自该服务器的任何可能有害的数据或代码。
2) 另一方面,我们有 JSONP,允许我们在没有启用 CORS 的情况下从服务器检索任意代码或数据,从而避免了 SOP 的主要目标。因此,即使在浏览器中硬连线 SOP,能够管理 JSONP 的恶意服务器也能够注入数据或代码。
所以我的问题是:
第二个论点是否正确?浏览器是否必须接受内容是由服务器决定的吗?
第二个论点是否正确?同样,是否接受数据也不在浏览器的决定范围内?
JSONP 不会使 SOP 无用吗?
谢谢指教!!
这里需要注意的是,如果用户登录了一个站点http://example.com/
,并且请求http://example.com/delete?id=1
删除了一个post用户,那么下面的代码将删除用户的 post:
<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>
s 但不能通过 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 攻击。因此,误导的服务器管理员可能会在他自己的站点中打开一个漏洞,但不会影响其他站点的安全。
我在理解 same-origin 政策和 "workaround" 政策的不同方式时遇到了一些困难。
很明显 same-origin 策略作为一种安全措施存在,因此来自 server/domain 的脚本无法访问来自另一个 server/domain.
[= 的数据15=]
同样清楚的是,有时打破此规则很有用,例如,混搭应用程序访问来自不同服务器的信息以构建所需的结果。其中一种方法是 CORS。
1) 如果我没记错的话,CORS 允许 目标服务器 对浏览器说“你可以从我这里拿走 data/code" 通过在响应中添加一些 headers。但是,如果这是正确的,这意味着恶意服务器只需添加此 header 并且浏览器将允许检索来自该服务器的任何可能有害的数据或代码。
2) 另一方面,我们有 JSONP,允许我们在没有启用 CORS 的情况下从服务器检索任意代码或数据,从而避免了 SOP 的主要目标。因此,即使在浏览器中硬连线 SOP,能够管理 JSONP 的恶意服务器也能够注入数据或代码。
所以我的问题是:
第二个论点是否正确?浏览器是否必须接受内容是由服务器决定的吗?
第二个论点是否正确?同样,是否接受数据也不在浏览器的决定范围内?
JSONP 不会使 SOP 无用吗?
谢谢指教!!
这里需要注意的是,如果用户登录了一个站点http://example.com/
,并且请求http://example.com/delete?id=1
删除了一个post用户,那么下面的代码将删除用户的 post:
<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>
s 但不能通过 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 攻击。因此,误导的服务器管理员可能会在他自己的站点中打开一个漏洞,但不会影响其他站点的安全。