2016-03-03 40 views
0

新的安全概念,所以我覺得這一定是以前完成的。在創建操作中檢查的新操作中生成密鑰

對於經典的提交表單:

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 

當然,這個解決方案也將有多個用戶同時提交表單的工作,讓一個鍵不生氣與另一個請求引用,然後錯誤地拋棄。

回答

0

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

0

它往往是實現自己的安全機制是一個壞主意。如果你不打算保護你的應用程序免受CSRF(這是內置的)並且仍然想要構建你自己的東西,也許你會對this rotp feature感興趣。