【发布时间】:2011-11-03 01:45:49
【问题描述】:
我刚刚对 Ruby on Rails 和模型 (Rails 3) 中的 attr_accessible 属性提出了一般性问题。有人可以解释应该在那里定义哪些模型属性吗?我记得一些关于大规模分配风险的事情,虽然我在这方面不太了解......谢谢:)
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
我刚刚对 Ruby on Rails 和模型 (Rails 3) 中的 attr_accessible 属性提出了一般性问题。有人可以解释应该在那里定义哪些模型属性吗?我记得一些关于大规模分配风险的事情,虽然我在这方面不太了解......谢谢:)
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3
Rails ActiveRecord documentation 对这个主题有一些很好的细节。
基本上attr_accessible:
指定可以通过以下方式设置的模型属性白名单 批量分配。
还有 attr_protected:
对这些属性的批量分配将被忽略,以分配 对他们来说,您可以使用直接编写器方法。这是为了保护 敏感属性不会被恶意用户覆盖 篡改 URL 或表单。
将 attr_accessible 视为您希望用户能够通过表单设置的属性列表,不在此列表中的任何内容都无法通过批量分配进行设置,这确保您将敏感值保留在您的数据库受到恶意用户的保护。这是确保您的应用程序安全的一小步,如果您想遵循 Rails 最佳实践,您应该查看Rails Security Guide。
【讨论】:
attr_accessible 是 rails 功能,借助它我们可以允许对模型属性进行质量分配。它在功能上与attr_protected 正好相反。
为了使特定属性可用于批量分配,我们使用attr_accessible,如下所示:
class Person < ActiveRecord::Base
attr_accessible : name
end
有关attr_accessible 和Strong parameters 的更详细说明,您可以访问以下链接:
[http://findnerd.com/list/view/attr-accessible-in-Rails-4/3654/][1]
【讨论】:
想象一个带有一些字段的订单类:
Order.new({ :type => 'Corn', :quantity => 6 })
现在假设订单也有折扣代码,例如:price_off。您不想将 :price_off 标记为 attr_accessible。这可以阻止恶意代码制作最终执行以下操作的帖子:
Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })
即使您的表单没有 :price_off 字段,如果默认情况下它只是在您的模型中,它也是可用的。精心制作的 POST 仍然可以设置它。
使用 attr_accessible 白名单可以批量分配这些内容,并保护您希望在代码中明确控制的字段。
Difference between attr_accessor and attr_accessible 有一些额外的链接。
【讨论】:
attr_accessible 允许您在模型上定义可以批量分配的属性白名单。因此,如果您有 10 个 attrs 但仅将其中 3 个列入白名单,则只能批量分配这三个。
class Foo < ActiveRecord:Base
#lets say you have attrs one, two, three
attr_accessible :one, :two
end
#You can do this:
Foo.new({:one => 1, :two => 2})
#if you were to do this:
Foo.new({:one => 1, :two => 2, :three => 3})
#Foo's three attr would not be set
【讨论】: