Rails attr_accessible:object vs:object_id

pcg*_*g79 12 security ruby-on-rails

User has_one Account.当设置attr_accessible在用户模式能够更好地保护:account,:account_id或两者兼而有之?

attr_accessible :account
Run Code Online (Sandbox Code Playgroud)

要么

attr_accessible :account_id
Run Code Online (Sandbox Code Playgroud)

要么

attr_accessible :account, :account_id
Run Code Online (Sandbox Code Playgroud)

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

更新以提供更多背景信息

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

在这样做的过程中,我找到了我们通过考试的测试

User.create account: account

以及我们在account_id中传递的位置:

User.create account_id: account.id

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

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

Ver*_*cus 7

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

user.update_attributes(:account => account)
Run Code Online (Sandbox Code Playgroud)

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

user.update_attributes(params[:user]) # params[:user][:account_id] is a part of this hash
Run Code Online (Sandbox Code Playgroud)

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

所以,总体来说,我会去前,做一个查询,以确保该帐户是一个你希望,但正如我在开始时说,你可以去这个取决于你打算如何使用它无论哪种方式.