Rails 4强参数:我可以'排除'/ blacklist属性而不是permit / whitelist吗?

时间:2013-09-17 08:02:51

标签: ruby-on-rails ruby ruby-on-rails-4

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

4 个答案:

答案 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>