在 Rails 中使用 HTTP GET 请求进行 CSRF 保护

Posted

技术标签:

【中文标题】在 Rails 中使用 HTTP GET 请求进行 CSRF 保护【英文标题】:CSRF Protection with HTTP GET requests in Rails 【发布时间】:2012-03-15 20:37:12 【问题描述】:

我知道 Rails 默认情况下对 HTTP GET 请求没有 CSRF 保护,因为它声称它们是幂等的。但是,这些 GET 请求会返回给用户的敏感信息,我不希望恶意网站检索这些信息。

在 Rails 中保护来自 CSRFHTTP GET 请求的最佳方法是什么?

【问题讨论】:

当恶意方进行 csrf 攻击时,他们看不到请求的结果 - 只有副作用是危险的 您通常使用通过 cookie 进行的身份验证来完成此类任务 @NikitaBeloglazov 即使通过 cookie 进行身份验证,当浏览器看到对受害者网站的请求时,它通常也会将 cookie 发送到受害者网站。这来自 [***文章] (en.wikipedia.org/wiki/…):“如果 Bob 的银行将他的身份验证信息保存在 cookie 中,并且如果 cookie 没有过期,那么 Bob 的浏览器加载图像的尝试将提交提款表单使用他的 cookie,从而在未经 Bob 批准的情况下授权交易。” @FrederickCheung 您能否进一步解释一下恶意方如何或为什么看不到或看不到请求的结果? 不这么认为。显然,Ajax 请求和类似请求将被单源策略禁止 【参考方案1】:

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

假设攻击请求确实是cross origin,Same Origin Policy for DOM 禁止通过 DOM 访问(例如使用iframe 嵌入时),Cross-Origin Resource Sharing (CORS) 通过XMLHttpRequest 调节跨域请求如下:

如果请求是simple cross-origin request,i。 e. simple method 只有simple header fields,然后该请求将被发送(这类似于基于 html 的 CSRF)。但是访问一个简单的跨域请求的响应取决于response allows resource sharing是否。

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

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

【讨论】:

以上是关于在 Rails 中使用 HTTP GET 请求进行 CSRF 保护的主要内容,如果未能解决你的问题,请参考以下文章

使用 Ruby on Rails 的 HTTP GET 请求:OpenSSL::SSL::SSLError

GET 和 POST 请求的相同 Rails 4 路由

Rails 3.2 `link_to`(在电子邮件中)与`method: :put`仍在产生GET请求

安卓HttpURLConnection 进行http请求(传递数据 获取数据 主线程禁止网络请求)以get方式为例

http网络请求基础get,post请求的注意事项

如何使用 Ruby on Rails 发出 HTTP 请求?