在创建操作中检查的新操作中生成密钥

问题描述:

新的安全概念,所以我觉得这一定是以前完成的。在创建操作中检查的新操作中生成密钥

对于经典的提交表单:

def new 
end 

def create 
    unless params[:key] != ENV["key"] 
    end 
end 

我对new.html.erb一个hidden_input与我在create行动正在检查的关键。但问题是这个键只是一个静态环境变量。

我想知道是否有办法动态地创建一个新的密钥,每次new.html.erb页面呈现,然后有create行动检查这个动态密钥。这需要在new操作中生成的变量,我可以在create操作中检查该变量。输出会是这样的:

def new 
    key = SecureRandom 
end 

def create 
    unless params[:key] != key 
    end 
end 

当然,这个解决方案也将有多个用户同时提交表单的工作,让一个键不生气与另一个请求引用,然后错误地抛弃。

Rails已经提供了一个名为CSRF令牌的保护级别。在每个表单中,生成一个authenticity_token并将其作为隐藏字段插入。该令牌与用户的会话相关联。提交POST请求后,authenticity_token将被检查。

https://nvisium.com/blog/2014/09/10/understanding-protectfromforgery/

使用protect_from_forgery在你的控制器,以启用此功能。

class ApplicationController < ActionController::Base 
    protect_from_forgery 
end 

http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html

+0

我知道CSRF,但我需要一些自定义来验证用户的特定身份 – james

它往往是实现自己的安全机制是一个坏主意。如果你不打算保护你的应用程序免受CSRF(这是内置的)并且仍然想要构建你自己的东西,也许你会对this rotp feature感兴趣。