有很多关于attr_accessible安全威胁的文章,我开始怀疑我是否应该拥有任何属性。这是问题所在。我有一个Message
模型,其中包含以下内容:
attr_accessible :body,:sender_id,:recipient_id
我的update
中没有edit
或messages_controller
操作。通过new
和create
操作,我可以创建新邮件并将其发送给收件人。只有已登录并满足特定条件的用户才能互相发送消息。我在before_filter
的帮助下做到这一点,条件正常。邮件已存储,可由sender
和recipient
查看。完美!
我的问题是,由于:body,:sender_id,:recipient_id
中包含attr_accessible
,恶意用户是否可以某种方式更改原始邮件的:body,:sender_id,:recipient_id
?我是否应该将这些属性添加到attr_readonly
,以便一旦保存就无法修改?
这个问题一直困扰着我几乎所有的模特。
答案 0 :(得分:3)
恶意用户可以以某种方式更改:body,:sender_id,:recipient_id 原始消息?
这取决于其他事情,而不是attr_accesible
。 attr_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
.....
答案 1 :(得分:1)
嗯,这取决于你是如何创建模型的实例的。如果您使用:
FooModel.create(params[:foo])
然后是的,您不安全,因为登录用户可能会将其他参数传递给请求,即使您没有为这些属性提供明确的表单字段。
因此,对于您的情况,任何使用sender_id,recipient_id(请求中的值)发布到“创建”操作的人都可以更改,除非您在操作中处理此分配