无法在 Rails 中验证 CSRF 令牌的真实性

Posted

技术标签:

【中文标题】无法在 Rails 中验证 CSRF 令牌的真实性【英文标题】:Can't verify CSRF token authenticity in rails 【发布时间】:2012-08-12 18:56:37 【问题描述】:

我正在使用 PaypalAdaptive。它正确发送 ipn_notification。 ipnNotification 动作方法如下 -

def ipn_notification
    ipn = PaypalAdaptive::IpnNotification.new
    ipn.send_back(request.raw_post.to_json)

    print "=====================request.raw_post#request.raw_post=============="

    if ipn.verified?
        PaymentMailer.notify_unknown(request.raw_post).deliver
    else
        logger.info "IT DIDNT WORK"
    end
    render :nothing => true
end

但它返回错误

WARNING: Can't verify CSRF token authenticity rails

对此问题的任何帮助。

【问题讨论】:

【参考方案1】:

在您的 application.js 中添加以下行

//= require jquery_ujs

然后尝试。

【讨论】:

【参考方案2】:

在您的控制器中:

skip_before_filter :verify_authenticity_token, :only => [:ipn_notification]

对于快速阅读并分发 -1 的人(跳过一个重要部分:这不是来自客户端的 POST 调用...):

是的,它会跳过安全性,但是...之后阅读...

是的,这是外部网站 POST 请求的唯一方式

是的,这很安全:当您接到来自 Paypal 或类似的电话时,您显然会检查参数和密钥。

【讨论】:

解释时答案会更好;) 这不是让我-1的简短答案。这是对像您这样的实现所带来的安全影响的缺失解释。您基本上绕过了 CSRF 保护 .. 这与付款相结合是一件坏事;) @matthiaskrull 在收到来自 tierce 服务的帖子时还有其他选择吗?我不这么认为。由于随后使用共享的身份验证密钥检查响应,因此这不是问题。 我没有看到。但这不是我想要表达的意思。也许只有我一个人,但我认为值得一提的是,如果一行代码改变了与安全相关的行为,它的真正作用是什么。 @matthiaskrull 当别无选择并且答案很好时,您的评论是一个很好的评论。我让你对指责权力感到满意【参考方案3】:

在不影响安全性的情况下解决此问题的正确方法

在您的 ajax 请求中,将 csrf 令牌值作为标头发送。

var csrfToken = $("meta[name='csrf-token']").attr("content");
$.ajaxSetup(
  headers: 
    'X-CSRF-Token': csrfToken
  
);

【讨论】:

@Magnum 更好的方法?也许,唉,它没有回答这个问题 - 1 小时前 apneadiving 这就是为什么我说这是“更好的方法”而不是“答案”

以上是关于无法在 Rails 中验证 CSRF 令牌的真实性的主要内容,如果未能解决你的问题,请参考以下文章

无法验证 CSRF 令牌真实性 Rails 4.1

Rails用户登录错误:无法验证CSRF令牌的真实性

Rails 3:无法验证 CSRF 令牌的真实性

即使设置了标头,也无法验证 CSRF 令牌的真实性 Rails 4 Ajax

Rails post 无法验证 CSRF 令牌的真实性

Rails:发出 POST 请求时无法验证 CSRF 令牌的真实性