REST和CSRF(跨站点请求伪造)

问题描述 投票:14回答:2

跨站点请求伪造是否可以对抗无状态RESTful服务?

我不是在谈论伪REST,服务器会记住你是通过cookie登录的。我说的是没有cookie的纯无应用程序状态的服务器REST。

我正在使用SSL和基本身份验证。对于每个请求,该Authorization标头必须在那里。尽管在SSL级别存在某种会话,但JSP意义上没有“会话”。

因此,我们假设我正在查看发出Ajax请求的合法网页,并且我会以某种方式转到同一选项卡或不同选项卡中的不同页面,并且该页面发出相同的Ajax请求。 (我假设合法网页上没有恶意代码;这完全是另一回事,在这种情况下一切皆有可能。)

当第二个页面发出Ajax请求时,浏览器是否会放置相同的Authorization标头?也就是浏览器会说“哦,你想再去那里?嘿,我碰巧还有钥匙!”?

此外,恶意脚本无法执行xhr请求,然后在回调中从ioargs获取请求,获取Authorization标头并取消Base64的名称和密码?

security rest csrf
2个回答
5
投票

免责声明:我不是安全专家。

使用HTTP Basic Auth不会通过GET请求阻止CSRF攻击。例如。其他人可以在他们的HTML页面中包含一个img标签,它在一些众所周知的URI上执行GET,并且您的浏览器将很乐意发送基本的身份验证信息。如果GET操作是“安全的”(这是声称是RESTful的任何东西的#1规则),这不会产生问题(超出浪费的带宽)。

由于同源策略,Ajax不是问题。

只在您生成的HTML中包含服务器生成的令牌,并验证其在表单提交请求中的存在,将保护您免受其他人在其页面中包含“外来”表单的影响。您可以将此限制为浏览器生成的内容类型;无需为XHR请求这样做。


1
投票

是否需要CSRF保护基于2个因素: -

  1. 请求是否正在执行状态更改操作(与REST API无状态不同) - 状态更改操作是将更改应用程序状态的任何操作...例如删除内容,添加内容,更新内容。这些是应用程序将使用其更改用户的支持状态的操作。所有Post请求和一些Get请求都属于此类别。 REST API可以具有状态更改操作。
  2. 是否由浏览器提供身份验证(不限于cookie) - 因为身份验证信息包含在浏览器请求中,无论请求是由用户启动还是其他一些打开的选项卡,都会发生CSRF。因此,浏览器可以自包含信息的任何类型的身份验证都需要CSRF保护。这包括基于cookie的会话和基本身份验证。

对于属于上述2类的所有请求,需要CSRF保护。

正如上面的Stephan所回答的,Ajax请求因同源策略(SOP)而受到保护。 SOP阻止另一个域读取目标域发送的内容。因此恶意脚本无法读取授权标头。但SOP不会阻止其他域向目标域发送请求。因此,恶意脚本仍然可以向目标域发出状态更改请求。浏览器将在此请求中包含身份验证信息和Cookie,因此服务器需要知道此请求是来自恶意域还是用户。因为这需要CSRF保护。

© www.soinside.com 2019 - 2024. All rights reserved.