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::Parametersinheritance自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