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