Rails - 缓存表单的真实性令牌错误无效

时间:2016-05-24 21:26:58

标签: ruby-on-rails

我正在开发一个Rails应用程序(版本4.2.5),该应用程序使用机架离线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

我的布局视图中包含<%= csrf_meta_tags %>

有什么方法可以解决这个问题,而不会影响应用的安全性?

EDIT 在Application控制器中,我替换了

protect_from_forgery with: :exception

protect_from_forgery with: :null_session

这解决了这个问题。但是,我不知道所有这些意味着什么,以了解这是否会产生安全漏洞。可以? (PS - 我真的想避免安全漏洞)

1 个答案:

答案 0 :(得分:2)

如果你有足够聪明的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完全相同。我已经看到这种情况发生在你有多个具有相同名称且设置了多个不同域字段的cookie时。你可以先将它们全部清除,看看到底是什么结果。