【问题标题】:Can't verify CSRF token authenticity in rails无法在 Rails 中验证 CSRF 令牌的真实性
【发布时间】: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

对此问题的任何帮助。

【问题讨论】:

    标签: ruby-on-rails csrf paypal-adaptive-payments


    【解决方案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
      • 这就是为什么我说这是“更好的方法”而不是“答案”
      猜你喜欢
      • 2017-07-15
      • 2015-07-24
      • 2014-06-16
      • 2012-05-08
      • 2015-12-29
      • 2023-03-26
      • 2016-09-17
      • 2012-12-11
      • 2019-07-15
      相关资源
      最近更新 更多