Rails 4强参数:我可以’排除’/ blacklist属性而不是permit / whitelist吗?
我正在将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
inheritance自Hash
!
2016年7月4日更新
在Rails 5中,根据升级指南,这可能不再起作用
ActionController ::参数不再从HashWithIndifferentAccessinheritance
白名单更安全。
但你可以尝试:在模型中:
self.permitted_params attribute_names - ["is_admin"] end
在控制器中:
def user_params params.require(:user).permit(*User.permitted_params) end