attr_accessible比attr_protected更安全

原文:http://somethinglearned.com/articles/2006/05/23/best-practices-a-strong-case-for-redacted-part-1

image

对于上面的模型,要求:

1:用户不能给自己管理员权限

2:只有管理员或者项目的所有者才可以删除一个项目

那么上面的代码是否完整?

答案是不完整。

attr_protected(*attributes):

在这个宏定义之后的属性不能用块赋值,也就是不能用new(attributes),update_attributes(attributes)或attributes=(attributes)来赋值,对这些属性的块赋值会被忽略,只能直接对这些属性来赋值。这是为了保护一些敏感属性,防止恶意用户通过URL或表单来改写。

attr_accessible(*attributes):

指定一个属性的白名单,这些属性可以通过块赋值来赋值,是attr_protected的反义词,其他属性只能直接用属性来赋值。

你知道我们的模型里面有多少方法可以通过块赋值进行调用么?你知道User模型有一个“project_ids=”方法么(由has_many宏提供)?它接受一个整数数组来指定属于用户的项目id,然后会更新存在的Project记录来指向新的所有者。

所以我们可以简单地通过URL参数来更新它:
user[project_ids][]=5

所以最好用attr_assessible来代替attr_protected,它体现了一条基本的安全准则:

everything should be implicitly denied unless explicitly allowed.

你可能感兴趣的:(protected)