批量分配漏洞

时间:2015-05-30 17:18:08

标签: ruby-on-rails security ruby-on-rails-4 mass-assignment

我有一个模型A,例如:

class A < ActiveRecord::Base
  validates_uniqueness_of :name
  attr_accessible :name
end

我想删除属性:name上的质量分配漏洞。所以我从这个模型中删除了行attr_accessible :name。这个模型没有控制器,所以我没有写任何强参数。该模型用于帮助器B.rb,如下所示:

num_users = A.where(:name => "NEW").count

我是否需要以任何方式更改此行,或者在我从模型中删除attr_attributed :name后此行仍然有效?

2 个答案:

答案 0 :(得分:1)

它会正常工作,质量分配保护只有在你指定质量时,即。你一次分配了很多属性(例如。A.create(params)),并且只有当你使用进入控制器的params时才会这样做。在使用您创建的哈希进行批量分配时,您不会遇到此问题。

答案 1 :(得分:1)

首先,无论是否使用质量分配,此行num_users = A.where(:name => "NEW").count都能正常工作。这是因为where方法不会将数据分配给模型记录。

另一方面,很少见到ruby-on-rails-4和质量分配标签的问题(两者都只有7个)。

这是因为Rails 4删除了mass_assignment并将其替换为strong_parameters,您可以在rails guides upgrade to 4.0找到它。

如果行attr_accessible :name在rails 4 app上运行正常。然后你必须在你的Gemfile上有protected_attributes gem。

必须有充分的理由将protected_attributes gem添加到Rails 4应用程序。如果没有,您可以从Gemfile中删除do bundle install并从模型中删除所有attr_accessible ...行。并且还从模型的操作中删除:without_protection => true参数(new,create,create!,update_attributes和update_attributes!,assign_attributes)。

如果你将gem protected_attributes保留在Gemfile中。然后,当您需要更新某些不是attr_accessible的字段时,您必须在操作中添加参数without_protection: true。这样:

A.create({name: 'NEW'}, without_protection: true)

记录将存储在数据库中。否则它将无法工作。