1

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

attr_accessible :body,:sender_id,:recipient_id

update的. edit_ messages_controller通过newandcreate操作,我可以创建一条新消息并将其发送给收件人。只有已登录并满足一定条件的用户才能互相发送消息。我在 a 的帮助下做到了这一点,before_filter并且条件很好。消息已存储并可通过sender和查看recipient。完美的!

我的问题是,既然:body,:sender_id,:recipient_id包含在 中attr_accessible,恶意用户可以以某种方式更改:body,:sender_id,:recipient_id原始消息的吗?我是否应该也将这些属性添加到其中attr_readonly,以便保存后无法修改它们?

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

4

2 回答 2

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
.....
于 2013-05-13T13:53:55.403 回答
1

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

FooModel.create(params[:foo])

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

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

于 2013-05-13T13:56:30.317 回答