15

通过批量分配防止安全风险的官方方法是使用attr_accessible。然而,一些程序员认为这不是模型的工作(或者至少不仅仅是模型)。在控制器中执行此操作的最简单方法是切片params哈希:

@user = User.update_attributes(params[:user].slice(:name))

但是文档指出:

请注意,使用 Hash#except 或 Hash#slice 代替 attr_accessible 来清理属性不会提供足够的保护。

这是为什么?为什么白名单切片参数不能提供足够的保护?

更新: Rails 4.0 将发布 strong-parameters,一个精细的参数切片,所以我想整个切片的事情毕竟不是那么糟糕。

4

5 回答 5

6

控制器中 slice 和 except 的问题可能与accept_nested_attributes_for您的模型一起出现。如果您使用嵌套属性,则需要在控制器中更新它们的所有位置对参数进行切片,这并不总是最简单的任务,尤其是在深度嵌套的场景中。使用attr_accesible你就没有这个问题。

于 2012-03-07T09:52:08.563 回答
4

从 Rails 4 开始,对参数进行切片将是处理批量分配安全性的首选方法。Rails 核心团队现在已经开发了一个插件来处理这个问题,他们正在努力集成对嵌套属性和签名表单的支持。绝对要检查的东西:http ://weblog.rubyonrails.org/2012/3/21/strong-parameters/

于 2012-03-23T12:55:44.580 回答
4

来自 DHH 的关于在控制器中切片与单独列入白名单的有趣要点:

https://gist.github.com/1975644

class PostsController < ActionController::Base
  def create
    Post.create(post_params)
  end

  def update
    Post.find(params[:id]).update_attributes!(post_params)
  end

  private
    def post_params
      params[:post].slice(:title, :content)
    end
end

评论强调需要在控制器内进行管理:

https://gist.github.com/1975644#gistcomment-88369

我个人将两者都应用 - attr_accessible 和 slice 以确保没有意外通过。永远不要单独依赖黑名单!

于 2012-11-29T20:52:02.180 回答
2

只需从参数哈希中删除 :name 即可防止为该操作设置该属性。它仅适用于您记得保护的操作。

但是,这种做法并不能保护您免受使用为关联自动添加的所有方法的滥用。

class User < ActiveRecord::Base
  has_many :comments
end

comments_ids即使您comments从参数中删除属性,也会让您容易受到设置属性的人的攻击。

由于为关联添加了相当多的方法,并且由于它们将来可能会发生变化,因此最佳实践是使用attr_accessible. 这将最有效地阻止此类攻击。

于 2011-09-20T10:31:37.787 回答
0

@tokland 您的最后评论在某种程度上是不正确的。除非您的网站将浏览器作为数据进出的唯一入口点。

如果您的 web 应用程序有 API 或与控制器级别的其他 API 保护通信,则会留下漏洞,并且不会对来自其他来源的所有数据进行清理或检查。我建议保持原样,在 application.rb 中打开批量分配保护,并推动 ActiveSupport FormHelpers 像 Django/Python 风格一样工作。

于 2012-05-03T15:27:05.817 回答