Rails 3.2 - 为控制器操作禁用 CSRF 保护

Posted

技术标签:

【中文标题】Rails 3.2 - 为控制器操作禁用 CSRF 保护【英文标题】:Rails 3.2 - Disable CSRF Protection for controller action 【发布时间】:2014-04-29 19:12:51 【问题描述】:

我有一个名为 ProductsController 的控制器,并且我创建了一个名为 set_status 的操作,用于从 .NET 客户端应用程序调用 PUT API。我已经正确设置了所有内容,但是在发送请求后,我收到“无法验证 CSRF 令牌真实性”错误。我的应用程序控制器中有以下用于 CSRF 保护的内容:

protect_from_forgery

为了绕过 CSRF 保护,我在 Products 控制器中添加了以下内容:

skip_before_filter :set_status

在使用此更改进行测试后,我仍然收到相同的错误消息。根据我的理解,上述代码行应该为 Products 控制器中的 set_status 操作禁用 CSRF 保护,但它似乎不起作用。

有没有人知道为什么这可能不起作用?非常感谢您!

【问题讨论】:

【参考方案1】:

我想通了!这是我的代码:

skip_before_filter :verify_authenticity_token, only: :set_status

我忘记了 protect_from_forgery 语句会创建自己的方法。其中一种方法是 verify_authenticity_token,因此它比我想象的要简单得多。我之前卡住了,因为我没有 verify_authenticity_token 方法,但实际上我有,因为它是自动生成的。

适用于 Rails 4+

skip_before_action :verify_authenticity_token, only: :set_status

【讨论】:

在最近的 Rails 版本中,使用 skip_before_action 而不是 skip_before_filter。 (skip_before_filter 已被弃用) 在最近的版本中,您还可以使用skip_forgery_protection(只是skip_before_action 的内置包装器)

以上是关于Rails 3.2 - 为控制器操作禁用 CSRF 保护的主要内容,如果未能解决你的问题,请参考以下文章

在rails 3中关闭CSRF令牌

禁用 Yii2 中单个操作的 CSRF 验证

在 Rails 3 中关闭 CSRF 令牌

Spring Security 3.2 CSRF 禁用特定 URL

嵌入式表单上的 CSRF 问题

在 ajax 提交时禁用 symfony 2 csrf 令牌保护