Выдавать исключение всякий раз, когда кто-то пытается массово назначить защищенные атрибуты - PullRequest
8 голосов
/ 06 апреля 2011

Я исправляю некоторые уязвимости массового назначения в клиентском приложении и хочу убедиться, что Rails молча не отбрасывает попытки массового назначения защищенных атрибутов.Вместо этого я хочу выдать исключение, чтобы я мог исследовать его.

Т.е. всякий раз, когда это обычно появляется в журналах:

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

Вместо этого я хотел бы выдать исключение (илидополнительно)

Редактировать: Я использую Rails 2.3.4

1 Ответ

10 голосов
/ 06 апреля 2011

Чтобы сделать это, вам нужно будет сделать несколько изменений в 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
...