【问题标题】:Rails 4 Strong parameters : permit all attributes?Rails 4 强参数:允许所有属性?
【发布时间】:2012-12-11 14:48:59
【问题描述】:

我正在使用 Rails 4 强参数构建一个 Web 应用程序。

在构建管理员后台控制器时,我想知道允许所有模型属性的最佳方式是什么?

现在,我写了这个:

def user_params 
  params.require(:user).permit(User.fields.keys)
end

你有没有更好的办法?

【问题讨论】:

  • 为什么?我只在我信任所有用户的管理后台做这种事情。
  • 仅仅因为你信任他们(你不应该信任他们,但那是另一回事),让你所有的数据都被覆盖是一个等待被利用的安全漏洞
  • @sevenseacat 至少他在问是否有更好的方法来做到这一点。
  • @AndrewGrimm 是的,但他仍然希望默认情况下允许所有内容,这是不安全的做法,并且完全否定了强参数的意义。
  • @Anwar '因为我懒得打字' 很可能是绕过安全措施的最糟糕的理由。

标签: ruby-on-rails ruby-on-rails-3 strong-parameters


【解决方案1】:

你可以调用 bang 版本的 permit。

params.require(:user).permit!

Strong Params README on Github

源代码供参考:

def permit!
  each_pair do |key, value|
    convert_hashes_to_parameters(key, value)
    self[key].permit! if self[key].respond_to? :permit!
  end

  @permitted = true
  self
end

【讨论】:

  • 在旁注中,我认为如果有类似permit :all 的东西,对我来说,它似乎比爆炸方法更像 Railish,这通常意味着接收器被更改的频率高于将方法标记为危险。
  • @daemonsy: permit(:all) 允许名为 :all 的字段。为了使这种风格如你所说,Rails 必须为处理:all 制定一个特殊情况——我认为这会很丑陋和令人困惑。如果您有一个名为“all”的列,您将陷入困境!我同意 bang 方法是次优选择。如果我正在设计 API,我会提供 permit_all 作为更好的选择。
  • 每次看到这个页面,我对:all的评论有点后悔。 =)。 permit_all 听起来确实比 bang 更好。
  • “bang 方法意味着将该方法标记为危险”——我认为这正是他们在这里使用 bang 方法的原因。
  • @daemonsy:那是因为您对 bang(!) 在方法名称中的含义有一个扭曲的看法。当然,对于某些方法,它意味着“就地更改”而不是复制。但这只是使用它的一种方式。实际规则是:bang 方法(以“!”结尾)是一种不以“标准”或预期方式运行的方法,因此值得特别注意或谨慎。这就是“!”的原因。
【解决方案2】:

以防万一有人需要 Rails 6,甚至没有模型链接到您的控制器,您可以使用:

before_action :accept_all_params

private

def accept_all_params
  params.permit!
end

大功告成,现在你可以随心所欲地玩?了!

【讨论】:

    【解决方案3】:

    Skull0inc 的答案有效,但您可能想要删除 created_atupdated_at。强参数的目的是仅列出您希望控制器更新的属性。 比如……

    def user_params
      params.require(:user).permit(User.column_names - ["created_at", "updated_at"])
    end
    

    【讨论】:

      【解决方案4】:

      这行得通吗?

      def user_params 
        params.require(:user).permit(User.column_names)
      end
      

      【讨论】:

        猜你喜欢
        • 2013-12-28
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-13
        相关资源
        最近更新 更多