2012-09-11 46 views
2

我最近進入rails,我看到這個MassAssignment錯誤很常見的情況下,我想用parent_id保存孩子。attr_accessible在Ruby on Rails 3及其安全影響

要解決此問題,所有人都建議將關聯的外鍵添加到attr_accessbile列表中。

我可以通過這樣做來解決這個問題,但我不確定發生了什麼。白名單foreign_key是否真的會造成安全問題?

讓我們考慮的車型以下情形:

class BusinessType < ActiveRecord ::Base 
     has_one :business_form 
     validates :name, :presence => true 
     attr_accesible :name, :enabled 
end 

class BusinessForm < ActiveRecord ::Base 
     belongs_to :business_type 
     validates :name, :presence => true 
     validates_associated :business_type, :presence=>true 
     attr_accessible :name, :enabled 
end 

在上述情況下,每當我試圖保存business_form沒有business_type_idattr_accessible名單,我會得到質量分配錯誤。當我將它添加到白名單時,即使business_type選擇框留空並且表單提交,我也沒有收到任何錯誤消息。

我要求任何人在這個領域的軌道上擺脫一些光。請指點我會詳細解釋的任何鏈接。

回答

4

是的,這會造成安全問題。假設有人能夠向您的BusinessFormController#create發送帖子,並且他們在帖子中傳遞了「business_type_id」。如果你的控制器通過簡單地做這樣的事情創造了紀錄:

def create 
    BusinessForm.create(params[:business_form]) 
end 

則允許用戶指定爲任何形式的業務類型。我不知道你的網站是如何工作的,但這可能是一個問題,因爲某些用戶可能被允許創建特定類型的表單。將外鍵添加到attr_accessible的主要問題是它允許黑客(任何知道Web編程的人)將這個新創建的記錄與任何外鍵對象相關聯。如果在這種情況下你不關心或者沒有限制,那麼它可能並不重要。

如果你還願意跟着什麼人都告訴你,爲什麼不保持attr_accessible沒有它「business_type_id」,但寫操作是這樣的:

def create 
    bf = BusinessForm.new({:business_type_id => params[:business_form][:business_type_id]}) 
    bf.attributes=(params[:business_form].except(:business_type_id)) 
    bf.create 
end 
0

Attr_accessible是非常簡單的。除非該字段被attr_accessible列入白名單,否則您無法分配從Web表單發送的值。

至於質量分配給外國關鍵的安全問題,你需要考慮以下情況:

  1. 這是可以接受的外鍵設置爲任何可能的值。羣體分配沒有安全威脅。

  2. 外鍵必須是特定數量的可接受值之一。在這種情況下,使用過濾器來確保從表單傳遞的值是可接受的,如果不是,則拒絕它。

  3. 外鍵總是可預測的值。在這種情況下,請勿使用代碼進行質量分配和外鍵分配。

+0

如果什麼人有外鍵的值更改爲一點兒也不存在的價值,給他們送去了submission.this將增加記錄無效的外鍵的 – Ramoji

+0

只要你有那麼你的模型的關係activerecord會拋出一個錯誤說外鍵記錄不存在。 – weexpectedTHIS