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

时间:2010-01-07 20:25:12

标签: security rest csrf

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

  1. 请求是否在执行状态更改操作(与REST API无状态不同)-状态更改操作是将更改应用程序状态的任何操作。例如,删除一些东西,添加一些东西,更新一些东西。这些是应用程序将用来更改用户支持状态的操作。所有“发帖”请求和一些“获取”请求将属于此类别。 REST API可以执行状态更改操作。

  2. 是浏览器提供的身份验证(不限于cookie)-发生CSRF的原因是浏览器在请求中包含了身份验证信息,而与用户是否发起请求无关,或者其他一些打开的标签。因此,浏览器可以自行包含信息的任何身份验证都需要CSRF保护。这包括基于cookie的会话和基本身份验证。

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

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