我正在开发一个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 - 我真的想避免安全漏洞)
答案 0 :(得分:2)
如果你有足够聪明的javascript使用它们,csrf_meta_tags对于ajax表单提交很有用。否则,您需要将带有令牌的常规表单字段放入表单中:
<%= hidden_field_tag :authenticity_token, form_authenticity_token %>
如果您在某种情况下构建了一个不包含真实性令牌的表单,这可能会解决您的问题。
以下是其他一些想法: