2

我最近陷入了困境,在我想用parent_id.

为了解决这个问题,每个人都建议将关联的外键添加到attr_accessbile列表中。

我可以通过这样做来解决它,但不确定引擎盖下会发生什么。将其列入白名单是否foreign_key会带来安全问题?

让我们考虑以下模型场景:

class BusinessType < ActiveRecord ::Base
      has_one :business_form
      validates :name, :presence => true
      attr_accesible :name, :enabled  
end

class BusinessForm < ActiveRecord ::Base
      belongs_to :business_type
      validates :name, :presence => true
      validates_associated :business_type, :presence=>true
      attr_accessible :name, :enabled
end

在上述情况下,每当我尝试保存business_form没有business_type_idattr_accessible列表中时,我都会得到质量分配错误。business_type当我将它添加到白名单时,即使选择框为空并且提交了表单,我也没有收到任何错误消息。

我要求任何人在这方面的铁轨上有所了解。请指出任何可以详细解释的链接。

4

2 回答 2

4

是的,这会带来安全问题。假设有人能够向您的 BusinessFormController#create 发帖,并且他们将“business_type_id”作为帖子的一部分传递。如果您的控制器只是通过执行以下操作来创建记录:

def create
  BusinessForm.create(params[:business_form])
end

然后它允许用户为该表单指定任何业务类型。我不知道您的网站是如何工作的,但这可能是个问题,因为某些用户可能被允许创建某些类型的表单。将外键添加到 attr_accessible 的主要问题是它允许黑客(任何了解 Web 编程的人)将这个新创建的记录与任何外键对象相关联。如果在这种情况下你不在乎或者它没有受到限制,那么它可能并不重要。

如果您仍然想遵循人们告诉您的内容,为什么不保留 attr_accessible 没有“business_type_id”,而是像这样编写您的操作:

def create
  bf = BusinessForm.new({:business_type_id => params[:business_form][:business_type_id]})
  bf.attributes=(params[:business_form].except(:business_type_id))
  bf.create
end
于 2012-09-11T06:58:55.803 回答
0

Attr_accessible 非常简单。除非该字段被 attr_accessible 列入白名单,否则您无法分配从 Web 表单发送的值。

至于批量分配给外键的安全隐患,您需要考虑以下场景:

  1. 可以将外键设置为任何可能的值。大规模分配没有安全威胁。

  2. 外键必须是特定数量的可接受值之一。在这种情况下,使用过滤器来确保从表单传递的值是可接受的,如果不是,则拒绝它。

  3. 外键将始终是可预测的值。在这种情况下,不允许批量分配并使用代码分配外键。

于 2012-09-11T13:01:14.207 回答