Rails attr_accessible:object vs:object_id

时间:2012-03-13 18:44:53

标签: ruby-on-rails security

User has_one Account。在用户模型上设置attr_accessible时,最好是保护:account:account_id还是两者兼而有之?

attr_accessible :account

attr_accessible :account_id

attr_accessible :account, :account_id

我觉得两者都是要走的路(因为它更安全),即使它感觉不那么干。

更新以提供更多背景

只是为了说明我为什么要问的背景。我和大多数人一样,看到了Github发生的事情,所以我们正在浏览我们的应用程序并将其锁定得更紧。

在这样做的过程中,我找到了我们通过帐户

的测试

User.create account: account

我们在account_id中传递的地方:

User.create account_id: account.id

我的选择是要么将它们全部更改为一致,要么更改attr_accessible以允许其中任何一个。我决定将它们全部改为一致。但是这让我担心我们可能在整个应用程序中使用这两种方法而且我可能会通过仅允许其中一种来破坏我们的应用程序。

当我说使用两者更安全时,我做错了。这是漫长的一天。

2 个答案:

答案 0 :(得分:7)

这个没有正确答案,但这取决于您打算如何更新此用户。 attr_accessible :account允许您直接批量分配帐户:

user.update_attributes(:account => account)

如果您已经拥有要与用户关联的帐户对象以及许多其他属性,则会很有帮助。另一方面,如果您从下拉列表或其他表单元素中分配帐户的ID,attr_accessible :account_id会更合适:

user.update_attributes(params[:user]) # params[:user][:account_id] is a part of this hash

后一种情况通常被认为更危险,并且是Github最近安全问题的一部分问题:您可以发布任何您喜欢的account_id,包括不属于您的帐户,并且您的用户将被分配到它

总的来说,我会选择前者并进行查找以确保帐户是您期望的帐户,但正如我在开头所说,您可以根据您打算如何使用这两种方式它

答案 1 :(得分:0)

您是否宁愿在帐户中设置attr_accessible :userattr_accessible :user_id。假设帐户为belongs_to :user

此外,attr_accessible是一个明确的白名单。我不知道attr_accessible :user, :user_id如何比attr_accessible :user更安全。