无法在 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 令牌的真实性的主要内容,如果未能解决你的问题,请参考以下文章