14

我正在将 Rails 3 应用程序迁移到 Rails 4,并且正在将attr_accessible属性转换为控制器中的强参数。API 文档展示了如何“允许”属性:

def person_params
  params.require(:person).permit(:name, :age)
end

但是,我的绝大多数属性都是批量分配安全的。只有几个属性:account_id:is_admin我需要将其列入黑名单。

是否可以将属性列入黑名单而不是将几乎所有属性都列入白名单?例如:

def user_params
  params.require(:user).exclude(:account_id, :is_admin)
end
4

4 回答 4

26

由于@Damien 概述的原因,我认为您不应该这样做,但这是我刚刚找到的解决方案。

params.require(:user).except!(:account_id, :is_admin).permit!

这将从哈希中删除:account_id, :is_admin并允许所有其他参数。但同样 - 这可能是不安全的。

为什么这行得通?因为ActionController::Parameters继承自Hash

2016 年 7 月 4 日更新

在 Rails 5 中,根据升级指南,这可能不再起作用

ActionController::Parameters 不再从 HashWithIndifferentAccess 继承

于 2013-09-30T10:39:46.250 回答
4

白名单更安全。

但你可以尝试: 在模型中:

self.permitted_params
  attribute_names - ["is_admin"]
end

在控制器中:

def user_params
  params.require(:user).permit(*User.permitted_params)
end
于 2013-09-17T08:10:19.203 回答
4

不,这是不可能的。
将属性列入黑名单将是一个安全问题,因为您的代码库可以发展,而其他应该列入黑名单的属性将来可能会被遗忘。

添加所有列入白名单的属性在实现时可能看起来很复杂。
然而,这是保持应用程序安全并避免干扰的唯一方法。

于 2013-09-17T08:08:47.077 回答
2

从文档中:是的,您可以使用except,它“返回一个过滤掉给定键的新 ActionController::Parameters 实例”:

params = ActionController::Parameters.new(a: 1, b: 2, c: 3)
params.except(:a, :b) # => <ActionController::Parameters {"c"=>3} permitted: false>
params.except(:d)     # => <ActionController::Parameters {"a"=>1, "b"=>2, "c"=>3} permitted: false>
于 2018-12-26T23:22:45.990 回答