1

關於attr_accessible的安全威脅有很多文字,我開始懷疑我是否應該擁有任何屬性。這是問題。我有一個Message模型,有以下幾點:attr_accessible需要的問題和解釋

attr_accessible :body,:sender_id,:recipient_id 

我沒有updateedit行動在我messages_controller。通過newcreate操作,我可以創建一條新消息並將其發送給收件人。只有已登錄且符合特定條件的用戶才能互相發送信息。我在before_filter的幫助下做到了這一點,條件正常。該消息已存儲,可通過senderrecipient查看。完善!

我的問題是,:body,:sender_id,:recipient_id包含在attr_accessible中,惡意用戶可以以某種方式更改原始郵件的:body,:sender_id,:recipient_id?我是否應該僅將這些屬性添加到attr_readonly以便保存後不能修改它們?

這個問題一直困擾着我幾乎所有的模型。

回答

3

惡意用戶能否以某種方式更改原始郵件的:body,:sender_id,:recipient_id ?

這取決於其他事情而不是attr_accesibleattr_accesible只會過濾哪些字段被允許使用質量分配進行更新。既然你說你沒有任何update動作,那麼不行,現在用戶可以編輯一條消息,因爲你總是通過創建動作創建一個新的Message

但有些事情需要關注。什麼是sender_id?如果您的應用程序中確實有用戶,並且他們互相發送消息,那麼sender_id不應該是可訪問字段,因爲這將允許用戶代表其他用戶發送消息。你可能想保留的那場關閉attr_accessible列表做這樣的事情:

m = Message.new params[:message] # body and recipient_id 
m.sender_id = current_user.id # this is not mass assignment 
m.save 
..... 
+0

sender.id == current_user.id。這就是我目前的方式。儘管如此,是否存在威脅? – pratski 2013-05-13 13:56:23

+1

爲什麼你會把sender_id放在列表中呢?這不應該是允許大規模分配的字段。 – aromero 2013-05-13 14:00:04

1

嗯,這取決於你如何創建模型的實例。如果你使用:

FooModel.create(params[:foo]) 

然後是,你並不安全,因爲登錄的用戶可以將其他參數傳遞到請求即使您不提供明確形成這些屬性的字段。

因此,對於您的情況下,任何人發佈與SENDER_ID你的「創造」的行動,recipient_id(在請求值)就能改變他們除非你照顧這個在您的操作指派

+0

明白了。謝謝。我關心行動中的任務。例如,發件人是current_user,而收件人是通過參數獲取的。但是收件人是通過隱藏字段獲得的,並且擁有一組用戶。 – pratski 2013-05-13 13:58:45

+1

然後,您應該從attr_accessible中刪除sender_id,並在您的操作中明確設置它。 – 2013-05-13 14:00:22

+0

我希望我可以選擇2個正確答案! – pratski 2013-05-13 14:04:01