【问题标题】:How does attr_accessible work in Rails?attr_accessible 在 Rails 中是如何工作的?
【发布时间】:2011-11-03 01:45:49
【问题描述】:

我刚刚对 Ruby on Rails 和模型 (Rails 3) 中的 attr_accessible 属性提出了一般性问题。有人可以解释应该在那里定义哪些模型属性吗?我记得一些关于大规模分配风险的事情,虽然我在这方面不太了解......谢谢:)

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    Rails ActiveRecord documentation 对这个主题有一些很好的细节。

    基本上attr_accessible:

    指定可以通过以下方式设置的模型属性白名单 批量分配。

    还有 attr_protected:

    对这些属性的批量分配将被忽略,以分配 对他们来说,您可以使用直接编写器方法。这是为了保护 敏感属性不会被恶意用户覆盖 篡改 URL 或表单。

    将 attr_accessible 视为您希望用户能够通过表单设置的属性列表,不在此列表中的任何内容都无法通过批量分配进行设置,这确保您将敏感值保留在您的数据库受到恶意用户的保护。这是确保您的应用程序安全的一小步,如果您想遵循 Rails 最佳实践,您应该查看Rails Security Guide

    【讨论】:

      【解决方案2】:

      attr_accessible 是 rails 功能,借助它我们可以允许对模型属性进行质量分配。它在功能上与attr_protected 正好相反。

      为了使特定属性可用于批量分配,我们使用attr_accessible,如下所示:

      class Person < ActiveRecord::Base
      attr_accessible : name
      end
      



      有关attr_accessibleStrong parameters 的更详细说明,您可以访问以下链接:

      [http://findnerd.com/list/view/attr-accessible-in-Rails-4/3654/][1]

      【讨论】:

        【解决方案3】:

        想象一个带有一些字段的订单类:

        Order.new({ :type => 'Corn', :quantity => 6 })
        

        现在假设订单也有折扣代码,例如:price_off。您不想将 :price_off 标记为 attr_accessible。这可以阻止恶意代码制作最终执行以下操作的帖子:

        Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })
        

        即使您的表单没有 :price_off 字段,如果默认情况下它只是在您的模型中,它也是可用的。精心制作的 POST 仍然可以设置它。

        使用 attr_accessible 白名单可以批量分配这些内容,并保护您希望在代码中明确控制的字段。

        Difference between attr_accessor and attr_accessible 有一些额外的链接。

        【讨论】:

        • 把password和password_confirmation放到attr_accessible中可以吗? BC 当我把它们拿出来时,它不允许我通过注册页面发送密码。我以为你不想让密码像那样公开访问?
        • 在我看来,密码和确认是您希望用户能够发送的东西,但对于注册对象而不是由注册产生的最终用户类-起来。
        【解决方案4】:

        attr_accessible 允许您在模型上定义可以批量分配的属性白名单。因此,如果您有 10 个 attrs 但仅将其中 3 个列入白名单,则只能批量分配这三个。

        class Foo < ActiveRecord:Base
          #lets say you have attrs one, two, three
          attr_accessible :one, :two
        end
        
        #You can do this:
        Foo.new({:one => 1, :two => 2})
        
        #if you were to do this:
        Foo.new({:one => 1, :two => 2, :three => 3})
        #Foo's three attr would not be set
        

        【讨论】:

        • 嗯,运行我的种子文件时,attr_accessible 中的属性会被阻止吗(我的种子文件会创建一个具有更高等级的管理员用户,但显然该等级不会作为开放选项提供)?
        • 只需在种子中手动设置它,而不是在带有哈希的 init 中。所以:u = User.new(some_hash); u.rank = 1.bajillion;你保存
        猜你喜欢
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多