Rails 4 强参数:我可以"排除"/将属性列入黑名单而不是许可/白名单吗?



我正在将 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
我认为

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

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

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

为什么会这样?因为ActionController::Parameters继承自Hash

更新 4th 七月 2016

在 Rails 5 中,根据升级指南,这可能不再有效

ActionController::P arameters不再继承自HashWithIndifferentAccess

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

在实现时,添加所有白名单属性似乎很复杂。
但是,这是确保应用程序安全并避免干扰事物的唯一方法。

白名单更安全。

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

self.permitted_params
  attribute_names - ["is_admin"]
end

在控制器中:

def user_params
  params.require(:user).permit(*User.permitted_params)
end

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

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>

最新更新