【问题标题】:attr_accessible/security question with rails - what is the best way to deal with this?使用 rails 的 attr_accessible/security 问题 - 处理这个问题的最佳方法是什么?
【发布时间】:2026-01-07 20:55:01
【问题描述】:

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

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

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

既然我们暴露了这些修改用户的控制器,在这种情况下attr_accessible不会允许设置directoradmin吗?这听起来像是一个很大的安全漏洞。

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

  1. 设置每个参数,一次一个?

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

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

  4. 使用 Rails 回调?例如before_validationbefore_save

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    即将发布的 Rails 3.1(目前有一个候选版本)为 attr_accessible 提供了一个新选项,允许您定义一个角色,该角色可以通过传递 without_protection => true 在控制器级别覆盖它。

    您可以在此处阅读更多信息: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

    【讨论】:

    • 很好,那我应该升级到 3.1。我的项目还处于早期阶段
    【解决方案2】:

    其中一个可能会有所帮助:

    https://github.com/dmitry/attr_accessible_block

    https://github.com/thefrontiergroup/scoped_attr_accessible

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

    【讨论】:

      最近更新 更多