通过质量分配来防止安全风险的正式方法是使用
attr_accessible.但是,有些程序员觉得这不是模型的工作(或至少不仅仅是模型).在控制器中执行此操作的最简单的方式是将params哈希:
@user = User.update_attributes(params[:user].slice(:name))
但文件规定:
Note that using Hash#except or Hash#slice in place of attr_accessible
to sanitize attributes won’t provide sufficient protection.
这是为什么?为什么白名单片段的params不能提供足够的保护?
更新:Rails 4.0 will ship strong-parameters,一个精细的参数切片,所以我猜整个切片的东西都没有那么糟糕.
解决方法
除了控制器之外,切片的问题可能与您的模型中的accept_nested_attributes_for相结合.如果使用嵌套属性,则需要在所有地方进行切片参数,在控制器中更新它们,这并不总是最简单的任务,尤其是深层嵌套的场景.使用attr_accesible你没有这个问题.