跨站点请求伪造是否可以对抗无状态RESTful服务?
我不是在谈论伪REST,服务器会记住你是通过cookie登录的。我说的是没有cookie的纯无应用程序状态的服务器REST。
我正在使用SSL和基本身份验证。对于每个请求,该Authorization标头必须在那里。尽管在SSL级别存在某种会话,但JSP意义上没有“会话”。
因此,我们假设我正在查看发出Ajax请求的合法网页,并且我会以某种方式转到同一选项卡或不同选项卡中的不同页面,并且该页面发出相同的Ajax请求。 (我假设合法网页上没有恶意代码;这完全是另一回事,在这种情况下一切皆有可能。)
当第二个页面发出Ajax请求时,浏览器是否会放置相同的Authorization标头?也就是浏览器会说“哦,你想再去那里?嘿,我碰巧还有钥匙!”?
此外,恶意脚本无法执行xhr请求,然后在回调中从ioargs获取请求,获取Authorization标头并取消Base64的名称和密码?
免责声明:我不是安全专家。
使用HTTP Basic Auth不会通过GET请求阻止CSRF攻击。例如。其他人可以在他们的HTML页面中包含一个img标签,它在一些众所周知的URI上执行GET,并且您的浏览器将很乐意发送基本的身份验证信息。如果GET操作是“安全的”(这是声称是RESTful的任何东西的#1规则),这不会产生问题(超出浪费的带宽)。
由于同源策略,Ajax不是问题。
只在您生成的HTML中包含服务器生成的令牌,并验证其在表单提交请求中的存在,将保护您免受其他人在其页面中包含“外来”表单的影响。您可以将此限制为浏览器生成的内容类型;无需为XHR请求这样做。
是否需要CSRF保护基于2个因素: -
对于属于上述2类的所有请求,需要CSRF保护。
正如上面的Stephan所回答的,Ajax请求因同源策略(SOP)而受到保护。 SOP阻止另一个域读取目标域发送的内容。因此恶意脚本无法读取授权标头。但SOP不会阻止其他域向目标域发送请求。因此,恶意脚本仍然可以向目标域发出状态更改请求。浏览器将在此请求中包含身份验证信息和Cookie,因此服务器需要知道此请求是来自恶意域还是用户。因为这需要CSRF保护。