【问题标题】:Strong parameters only for update/create or for all actions仅用于更新/创建或所有操作的强参数
【发布时间】:2016-02-08 19:04:26
【问题描述】:
strong parameters 需要的嵌套格式自动随表单一起提供,即 update 和 create 操作。
这是否意味着它仅适用于这些操作,而对于其他获取请求,我们应该在控制器中使用普通的旧 params[:token]?
我问的原因是要了解我是否应该为像这样的获取请求创建嵌套格式link_to user.first_name, user_path(user: {token: user.token}) 或干脆做link_to user.first_name, user_path(token: user.token)
【问题讨论】:
标签:
ruby-on-rails
ruby-on-rails-4
strong-parameters
【解决方案1】:
强参数是一种安全机制,仅与添加或更改数据的操作有关,特别是同时对多个属性执行此操作的操作,因此称为批量分配。通常使用批量分配的典型控制器方法是创建和更新,因此这些通常是唯一需要保护的方法。我说通常是因为您始终可以拥有使用质量分配的自定义控制器方法。
批量分配如下所示:
attrs = {:first => "John", :last => "Doe", :email => "john.doe@example.com"}
user = User.new(attrs)
您现在有一个分配了所有这些属性的用户,这是一件很方便的事情。否则,您将不得不手动执行每个属性。问题是,如果您没有将可以通过强参数分配的属性列入白名单,那么有人可能会操纵 POST 或 PUT/PATCH 请求说出类似 :admin => true 的内容
希望这样可以更清楚一点。
【解决方案2】:
Strong Parameters 提供一个接口,用于保护属性免受最终用户分配的影响。 Strong Parameters Action Controller 参数在被列入白名单之前禁止在 Active Model mass assignments 中使用。这意味着您必须有意识地选择允许大规模更新的属性,从而防止意外暴露不应该暴露的属性。
因此,这适用于create 和update 操作,因为您正在更新这两种操作的属性。在GET 请求中,您不会更新任何属性。因此,这些请求中不需要强参数。
【解决方案3】:
简而言之,我们需要对所有POST & PATCH(PUT) 方法操作使用强参数进行验证和更新。