使用rails的attr_accessible / security问题 - 处理此问题的最佳方法是什么?

时间:2011-05-28 14:24:08

标签: ruby-on-rails ruby security parameters attr-accessible

我有一个关于Rails安全性的问题。假设我们有User模型,它有很多角色的布尔值,例如admindirector等等。

管理员肯定希望在表单上编辑这些值,因此我们希望使用attr_accessible让管理员用户执行此操作。

当然,其他用途也可以编辑他们的用户模型 - 编辑他们的个人资料,或者他们自己邀请/添加新用户。在导演的情况下,我们实际上希望他们设置比导演“更小”的角色,但我们不希望他能够设置directoradmin

由于我们公开了这些修改用户的控制器,在这种情况下,attr_accessible是否允许设置directoradmin?这听起来像是一个非常大的安全漏洞。

那么限制访问的最佳方式是什么?

  1. 一次设置一个参数?

  2. 在创建/更新操作上设置admin = falsedirector = false?最简单的解决方案,但有点讨厌在控制器中使用它。

  3. 使用if语句查看该用户角色是否可以编辑这些属性并允许它?

  4. 使用rails回调?,例如before_validationbefore_save

  5. 其他一些声明性解决方案?

  6. 由于

2 个答案:

答案 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

...允许您使用基于角色的条件来确定可以设置哪些属性。