attr_accessible需要问题和澄清

时间:2013-05-13 13:32:11

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 attr-accessible

有很多关于attr_accessible安全威胁的文章,我开始怀疑我是否应该拥有任何属性。这是问题所在。我有一个Message模型,其中包含以下内容:

attr_accessible :body,:sender_id,:recipient_id

我的update中没有editmessages_controller操作。通过newcreate操作,我可以创建新邮件并将其发送给收件人。只有已登录并满足特定条件的用户才能互相发送消息。我在before_filter的帮助下做到这一点,条件正常。邮件已存储,可由senderrecipient查看。完美!

我的问题是,由于:body,:sender_id,:recipient_id中包含attr_accessible,恶意用户是否可以某种方式更改原始邮件的:body,:sender_id,:recipient_id?我是否应该将这些属性添加到attr_readonly,以便一旦保存就无法修改?

这个问题一直困扰着我几乎所有的模特。

2 个答案:

答案 0 :(得分: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
.....

答案 1 :(得分:1)

嗯,这取决于你是如何创建模型的实例的。如果您使用:

FooModel.create(params[:foo])

然后是的,您不安全,因为登录用户可能会将其他参数传递给请求,即使您没有为这些属性提供明确的表单字段。

因此,对于您的情况,任何使用sender_id,recipient_id(请求中的值)发布到“创建”操作的人都可以更改,除非您在操作中处理此分配