【发布时间】:2011-11-20 23:00:08
【问题描述】:
通过批量分配防止安全风险的官方方法是使用attr_accessible。然而,一些程序员认为这不是模型的工作(或者至少不是only模型)。在控制器中执行此操作的最简单方法是切片 params 哈希:
@user = User.update_attributes(params[:user].slice(:name))
但是文档指出:
请注意,使用 Hash#except 或 Hash#slice 代替 attr_accessible 清理属性无法提供足够的保护。
这是为什么呢? 为什么params 的白名单切片不能提供足够的保护?
更新:Rails 4.0 will ship strong-parameters,一个精细的参数切片,所以我想整个切片的事情毕竟不是那么糟糕。
【问题讨论】:
-
对于初学者来说,这只是一个不便。使用
attr_accesible,如果需要,您可以在模型中使用:name(尽管没有保存它),但是如果您将.slice它从params散列中取出,则不能这样做。使用attr_accesible也更加语义化,因为它告诉其他人与模型的属性关系,而切片则更加神秘。 -
@Alex:我知道 attr_accessible 是一种管理批量分配的便捷方式。好的,但是使用 params[:xyz].slice 的安全漏洞是什么?
-
作为记录,attr_accessible 现在声明“请注意,使用 Hash#except 或 Hash#slice 代替 attr_accessible 来清理属性提供了基本相同的功能,但它有点棘手处理嵌套属性。" 另外,请参阅 Edge API 了解高级 Rails 4 文档,参阅 strong_parameters plugin 了解在 Rails 4 之前使用什么。
标签: ruby-on-rails ruby security mass-assignment strong-parameters