【问题标题】:Rails - invalid authenticity token error for cached formRails - 缓存表单的无效真实性令牌错误
【发布时间】:2016-05-24 21:26:57
【问题描述】:

我正在开发一个 Rails 应用程序(版本 4.2.5),它使用 rack-offline gem 来缓存用户在没有互联网连接时可以填写的表单(条目存储为可以提交的 localStorage 对象稍后当用户有连接时)。但是,当提交表单时,我收到了错误

ActionController::InvalidAuthenticityToken in EntriesController#create

当我在 Rails 服务器关闭时打开一个新的浏览器窗口并导航到 http://localhost:3000/entries/new(页面已被缓存 - 它呈现得很好),填写表单,然后重新打开服务器并尝试提交。

来自我的条目控制器:

def create
    @entry = Entry.create(entry_params)
    redirect_to "http://localhost:3000/entries"
end

以及应用程序控制器:

class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
end

在我的布局视图中包括&lt;%= csrf_meta_tags %&gt;

有什么方法可以在不影响应用安全性的情况下解决此问题?

编辑 在应用程序控制器中,我替换了

protect_from_forgery with: :exception

protect_from_forgery with: :null_session

这解决了问题。但是,我对这一切意味着什么了解不够,无法理解这是否会造成安全漏洞。可以? (PS - 我真的很想避免安全漏洞)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    如果您有足够智能的 javascript 来使用 csrf_meta_tags,那么它们对于提交 ajax 表单很有用。否则,您需要将带有令牌的常规表单字段放入表单中:

    <%= hidden_field_tag :authenticity_token, form_authenticity_token %>
    

    如果您以某种方式构建了一个没有包含真实性令牌的表单,这可能会解决您的问题。

    这里有一些其他的想法:

    1. 通过检查 HTTP 交换来确保真实性令牌实际发送到服务器
    2. 确保为您的表单提供服务的服务器与接收表单提交的服务器相同(或至少服务器之间的 secret_key_base 匹配)
    3. 确保您在提交表单时用于检索表单的会话 cookie 没有丢失或过期
    4. 说到 cookie,请确保您发送的会话 cookie 与您在请求表单时检索到的完全相同。我已经看到当您有多个具有相同名称的 cookie 并设置了多个不同的域字段时会发生这种情况。您可以先将它们全部清除,看看最后会得到什么。

    【讨论】:

    • 谢谢 - 我试过了,但这给了我错误ActionController::InvalidAuthenticityToken。我还尝试了 ,我在其他地方看到有人推荐过 - 结果相同。我可能会忽略什么?
    • 我添加了我能想到的所有其他我发现哪里出错的地方。
    • 谢谢 - 我会处理这个,看看我能想出什么。
    • 啊 - 我想我理解这个问题......表单本身正在页面的 Javascript 中提供(它是动态创建的),然后通过 rack::offline 缓存。然后我关闭服务器并重新启动它,这意味着我违反了你上面的第二点。我会看看我是否能找到解决这个问题的方法 - 这让我觉得我可能需要稍微不同地构建我的应用程序......
    猜你喜欢
    • 2018-06-29
    • 2010-11-15
    • 1970-01-01
    • 2017-03-16
    • 2018-06-20
    • 2019-06-20
    • 2011-03-04
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多