我正在将Rails 3应用程序迁移到Rails 4,我正在将attr_accessible
属性转换为控制器中的强参数。 API Documentation显示了如何“允许”属性:
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
答案 0 :(得分:21)
我认为你不应该出于@Damien概述的原因那样做,但这是我刚刚找到的解决方案。
params.require(:user).except!(:account_id, :is_admin).permit!
这将从哈希中删除:account_id, :is_admin
并允许所有其他参数。
但同样 - 这可能是不安全的。
为什么会这样?因为ActionController::Parameters
继承自Hash
!
2016年7月4日更新
在Rails 5中,这可能不再适用于升级指南
ActionController ::参数不再从HashWithIndifferentAccess继承
答案 1 :(得分:2)
不,这是不可能的。
黑名单属性将是一个安全问题,因为您的代码库可以发展,并且将来可能会忘记应列入黑名单的其他属性。
添加所有列入白名单的属性在实施时可能看起来很复杂 但是,这是保证应用程序安全并避免disturbing things的唯一方法。
答案 2 :(得分:2)
白名单更安全。
但你可以尝试: 在模型中:
self.permitted_params
attribute_names - ["is_admin"]
end
在控制器中:
def user_params
params.require(:user).permit(*User.permitted_params)
end
答案 3 :(得分:0)
From the docs:是的,您可以使用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>