【问题标题】:Throw an exception whenever someone tries to mass-assign protected attributes每当有人尝试批量分配受保护的属性时抛出异常
【发布时间】:2011-04-05 21:12:00
【问题描述】:

我正在修复客户端应用程序中的一些批量分配漏洞,并且我想确保 Rails 不会静默放弃批量分配受保护属性的尝试。相反,我想抛出一个异常以便进行调查。

即,只要这通常会出现在日志中:

WARNING: Can't mass-assign these protected attributes: ...

我想改为(或另外)抛出异常

编辑:我使用的是 Rails 2.3.4

【问题讨论】:

    标签: ruby-on-rails activerecord attributes ruby-on-rails-2


    【解决方案1】:

    你必须做一些 Rails 猴子补丁才能做到这一点。请确保仅在开发和/或测试中使用此代码,因为如果用户尝试进行批量分配,您不希望您的应用程序引发错误。我会将以下内容添加到config/initializers/error_mass_assign.rb

    module ActiveModel
      module MassAssignmentSecurity
        module Sanitizer
        protected
          def warn!(attrs)
            self.logger.debug "WARNING: Can't mass-assign protected attributes: #{attrs.join(', ')}" if self.logger
            raise(RuntimeError, "Mass assignment error") if ['test', 'development'].include?(Rails.env)
          end
        end
      end
    end
    

    这将引发常规警告,但在测试和开发环境中任何时候大规模分配受保护的属性时,它也会引发带有消息“大规模分配错误”的 RuntimeError。如果您更喜欢其他异常,也可以修改上面代码中的错误消息或错误。

    请务必重新启动您的控制台或服务器以使其生效。

    P.S:在 Rails 2 中,您需要执行以下操作:

    module ActiveRecord
      class Base
        def log_protected_attribute_removal(*attributes)
          logger.debug "WARNING: Can't mass-assign these protected attributes: #{attributes.join(', ')}"
          raise(RuntimeError, "Mass assignment error")
        end
      end
    end
    

    【讨论】:

    • 为什么我不想在生产中这样做?即,如果用户尝试进行批量分配,他要么试图做一些违反规则的事情(在这种情况下,如果他的请求失败也没关系)或者我忘记使属性可访问(在这种情况下我想知道关于它)。
    • 另外,很抱歉没有在问题中提及,但我使用的是 Rails 2.3.4。我应该对您的答案进行哪些更改才能使其在我的 Rails 版本中工作?
    • 如果你这样做很好,你只是想捕捉错误并适当地处理它,你不想给你的用户留下 500 个错误页面而没有任何解释。例如,如果用户试图入侵您的网站,那么您可能应该在发生这种情况时收到通知,如果您忘记将属性设置为可访问,则需要修复。
    • 从 Rails 3.2 开始,您可以通过将 config.active_record.mass_assignment_sanitizer = :strict 添加到您的 development.rbtest.rb 配置文件来实现此行为
    • 在较新的 Rails (3.2) 中,Sanitizer 是一个类而不是一个模块
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多