我有一个关于Rails安全性的问题。假设我们有User
模型,它有很多角色的布尔值,例如admin
,director
等等。
管理员肯定希望在表单上编辑这些值,因此我们希望使用attr_accessible
让管理员用户执行此操作。
当然,其他用途也可以编辑他们的用户模型 - 编辑他们的个人资料,或者他们自己邀请/添加新用户。在导演的情况下,我们实际上希望他们设置比导演“更小”的角色,但我们不希望他能够设置director
或admin
由于我们公开了这些修改用户的控制器,在这种情况下,attr_accessible
是否允许设置director
和admin
?这听起来像是一个非常大的安全漏洞。
那么限制访问的最佳方式是什么?
一次设置一个参数?
在创建/更新操作上设置admin = false
和director = false
?最简单的解决方案,但有点讨厌在控制器中使用它。
使用if语句查看该用户角色是否可以编辑这些属性并允许它?
使用rails回调?,例如before_validation
或before_save
?
其他一些声明性解决方案?
由于
答案 0 :(得分:3)
即将发布的Rails 3.1(目前有一个候选版本)有attr_accessible
的新选项,允许您通过传递{{without_protection => true
来定义一个可以在控制器级别覆盖它的角色。 1}}。
您可以在此处详细了解:http://www.enlightsolutions.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1
此处有关于rails安全指南中有关attr_accessible的部分:http://edgeguides.rubyonrails.org/security.html#countermeasures
答案 1 :(得分:0)
其中一个可能有所帮助:
https://github.com/dmitry/attr_accessible_block
https://github.com/thefrontiergroup/scoped_attr_accessible
...允许您使用基于角色的条件来确定可以设置哪些属性。