批量分配漏洞

Mass Assignment Vulnerability

我有一个模型 A 例如:

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

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

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

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

它会很好用,批量赋值保护只在你批量赋值时,即。您一次分配了很多属性(例如 A.create(params)),并且也只有当您使用进入控制器的 params 时,即。使用您创建的哈希自己进行批量分配时,您将永远不会遇到这个问题。

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

另一方面,很少看到带有 ruby-on-rails-4 和 mass-assignment 标签的问题(只有 7 个同时带有两者)。

这是因为Rails 4 把mass_assignment去掉,换成strong_parameters,可以在rails guides upgrade to 4.0.

找到

如果行 attr_accessible :name 在您的 rails 4 应用程序上运行良好。那么你的 Gemfile 中必须有 protected_attributes gem。

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

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

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

并且记录将存储在数据库中。不然不行。