禁用特定操作的强参数

Posted

技术标签:

【中文标题】禁用特定操作的强参数【英文标题】:Disable strong parameters for a specific action 【发布时间】:2015-08-11 03:29:46 【问题描述】:

我对强参数有一个严重的问题。它在我的大约 200 个动作中运行良好,但在一个动作中却没有,因为我正在使用那里的参数非常动态,而且由于应用程序设计,我也无法更改它。

所以我想在这个特定的操作中禁用强参数验证。有没有办法做到这一点?

【问题讨论】:

为什么不能在这个特定的地方使用if??? 因为我不知道参数将如何命名。我的行动基于元编程...... 【参考方案1】:

不太确定这是否是最佳实践,但对于 Rails 5,我只使用 request.params 而不是 params,只要我想跳过强参数。

所以不要像这样:

post = Post.new(params[:post])

我用:

post = Post.new(request.params[:post])

【讨论】:

【参考方案2】:

强参数覆盖ActionController::Base 中的params 方法。您可以简单地覆盖它并将其设置回您自己想要的。

所以这个:

class MyController < ApplicationController
  def params
    request.parameters
  end
end

将有效禁用控制器中所有操作的强参数。您只想为特定操作禁用它,因此您可以这样做:

class MyController < ApplicationController
  before_action :use_unsafe_params, only: [:particular_action]

  def params
    @_dangerous_params || super
  end

  def particular_action
    # My params is unsafe
  end

  def normal_action
    # my params is safe
  end

  private

  def use_unsafe_params
    @_dangerous_params = request.parameters
  end
end

【讨论】:

【参考方案3】:

您可以使用.permit! 将哈希中的任何键列入白名单。

params.require(:something).permit!

但是,这应该被视为极端的代码异味和安全风险。

嵌套哈希可以通过这个技巧被列入白名单:

params.require(:product).permit(:name, data: params[:product][:data].try(:keys))

【讨论】:

这对我不起作用,因为参数的名称不是静态定义的,它们是由显示的对象定义的。我知道这听起来像是一个很大的安全漏洞,但我在方法逻辑中实现了安全机制。我真的需要在一个动作中关闭强参数 我能想到使用config.action_controller.permit_all_parameters 的唯一方法,但这是在每个应用程序的基础上完成的。不是每次操作。 是的,对于开发模式,我禁用了强参数,但在生产模式下我不能这样做 您可以创建某种函数,递归遍历参数哈希并将其列入白名单。但是我不能给你一个例子,因为我不知道你的控制器是什么样子的。 我认为修改强参数 gem 的方式允许禁用特定于 gem 的操作更容易

以上是关于禁用特定操作的强参数的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 中的强类型剩余参数

DeviseTokenAuth 控制器的强参数覆盖

在 ajax 提交时禁用 symfony 2 csrf 令牌保护

C ++如何禁用具有不同符号变量比较的特定行的编译器警告?

禁用Linux下ctrl+alt+del操作系统参数

仅对特定子系统禁用过零检测