【问题标题】:`InvalidAuthenticityToken` error in rails post routerails post route中的`InvalidAuthenticityToken`错误
【发布时间】:2018-11-11 11:47:33
【问题描述】:

我有一个带有 POST url 的 Rails 应用程序,它创建了一些资源。我有一个带有表单的页面,它接收所有信息并对 POST url 进行 AJAX 调用,而没有真实性令牌。

在进行 AJAX 调用之前,我正在做 data["authenticity_token"] = "";

服务器端记录的参数如下

{"utf8"=>"✓", "authenticity_token"=>"", "company_customer"=>{"name"=>"Anand"}}

资源的创建没有任何错误(我的ApplicationController 中有protect_from_forgery with: :exception)。

但是当我尝试从 Postman 调用相同的 POST url 时,我收到 InvalidAuthenticityToken 错误。

  1. 为什么会出现错误?
  2. rails 应用在第一种情况下如何验证 POST 请求的真实性?

【问题讨论】:

    标签: ruby-on-rails security csrf-protection


    【解决方案1】:

    在第一步,即从浏览器中,您可能在 cookie 中有一些会话 id,但这里没有。

    另外,如果您点击remote:true 选项,它将从隐藏字段中的页面获取真实性令牌。

    有关更多详细信息,请在这两种情况下检查您的日志。

    【讨论】:

    • 我没有做remote: true。我正在序列化输入字段并使用 jQuery ajax 调用发送它。在发送 tge 请求时,我将 authenticity_token 设为 nil(用于测试)。仍然处理请求而没有任何错误。但是当我从邮递员那里发送没有authentity_token 的请求时,我得到了错误。
    【解决方案2】:

    当您使用 form_for 辅助方法生成表单时,此标记会自动添加为隐藏字段,因此 Rails 会确保请求来自您的表单之一。

    当邮递员或任何其他应用程序请求时,您应该取消保护您的控制器操作,请参阅此处的操作方法:https://stackoverflow.com/a/22715175/8352929

    【讨论】:

    • 仅供参考,引用的解决方案引入了一个 csrf 漏洞。
    【解决方案3】:

    您可以从here 了解 CSRF 的工作原理。我建议你通过它。

    每当您使用form_for 时,Rails 都会向您的表单添加一个隐藏的输入字段,如下所示:

    <input type="hidden" name="authenticity_token" value="doLYVxrkhdrzn7zzriHXjFE6ZhNCuXVxLrau4ouENmuKKC/SWp2NMM/MeL/Ji2tDvzNcJHVN/Hc0LIluL3o5QQ==" />
    

    此外,Rails 在网站的元标记中包含 CSRF 令牌,如下所示:

    <meta name="csrf-token" content="zxnmBxg81JUQPG/C/wb3HRCah0m9Xe2A+gZ5N0Oy7cfwC+dF4hC325WxdVDLfkIxcw/CR/xyaC1phpvZ4EcgQw==" />
    

    因此,当您使用 Rails form_for 或类似的东西来进行 AJAX 调用(可能使用 remote: true)时,真实性令牌会发送到服务器。当您尝试使用 Postman 发送相同的请求时,哪个不存在。

    如果复制 CSRF 令牌并将其添加到 Postman 参数中,则请求将成功完成。

    【讨论】:

    • 我已经评论了上面的答案之一,我仍然会在这里再次粘贴。我没有做remote: true。我正在序列化输入字段并使用 jQuery ajax 调用发送它。在发送 tge 请求时,我将 authenticity_token 设为 nil(用于测试)。仍然处理请求而没有任何错误。但是当我从邮递员那里发送没有authentity_token 的请求时,我得到了错误。
    • 您可以通过检查服务器日志下的params 来确认吗?也请用信息更新您的问题
    • jquery-ujs 在使用 POST 和 jquery 时自动添加 CSRF 令牌。参考:stackoverflow.com/questions/35162218/…
    • 在发出 AJAX 请求之前,我手动创建了 authenticity_token nil。我检查了服务器日志,令牌显示为空白。这就是为什么我感到困惑。没有authenticity_token 怎么会验证请求?在那种情况下,它也应该与邮递员一起使用
    • 您能否转储问题中负责 AJAX 调用的服务器日志和 jQuery 代码?
    猜你喜欢
    • 2015-11-23
    • 2016-11-14
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多