9

据我所知,默认情况下,Rails缺少对HTTP GET请求的CSRF保护,因为它声称它们是幂等的。但是,有些敏感信息会从这些GET请求中返回给用户,并且我不希望恶意网站检索这些信息。在Rails中使用HTTP GET请求进行CSRF保护

什么是最好的方式来保护HTTP GET请求从CSRF在Rails?

+1

当恶意方不CSRF攻击,他们看不到请求的结果 - 唯一副作用是危险 – 2012-02-25 18:48:12

+0

您通常通过cookie使用验证了这种任务 – 2012-02-25 20:16:13

+0

的@NikitaBeloglazov即使认证通过cookies ,当浏览器看到受害者网站的请求时,浏览器通常将cookie发送到受害者网站。这来自[维基百科文章](http://en.wikipedia.org/wiki/Cross-site_request_forgery#Example_and_characteristics): “如果Bob的银行将其认证信息保存在cookie中,并且cookie尚未过期,那么Bob浏览器加载图片的尝试将提交他的cookie的提款表单,从而在未经Bob批准的情况下授权交易。“ – 2012-02-26 19:37:58

回答

9

为了能够读取对CSRF攻击请求的响应,攻击者需要让受害者执行他的JavaScript代码。在这种情况下,访问将受到一些Same Origin Policy的限制。

假设攻击请求真的cross origin,所述Same Origin Policy for DOM禁止经由DOM的访问(例如,当使用iframe嵌入)和Cross-Origin Resource Sharing (CORS)经由XMLHttpRequest调节跨域请求如下:

如果该请求是一个simple cross-origin request,我。即simple method只有simple header fields,那么这个请求将被发送(这与基于HTML的CSRF类似)。但访问简单的跨源请求的响应取决于response allows resource sharing

在发送实际请求之前,其他跨源请求需要所谓的preflight。该请求被发送以检查服务器是否允许来自发送预检的来源的请求。只有预检成功并且对实际请求的响应允许资源共享,才能访问响应。

因此得出结论:除非您的服务器支持CORS并明确允许与任何其他来源(即Access-Control-Allow-Origin: *)共享,否则CSRF响应(如果请求被允许)将不会被攻击站点读取。