2011-04-05 10 views
8

Estoy arreglando algunas vulnerabilidades de asignación masiva en la aplicación de un cliente y quiero asegurarme de que Rails no abandone silenciosamente los intentos de asignar en masa atributos protegidos. En cambio, quiero lanzar una excepción para que pueda investigar.Lanza una excepción cada vez que alguien intente asignar en masa los atributos protegidos

Es decir, cada vez que esto normalmente aparecería en los registros:

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

me gustaría lanzar una excepción en lugar (o además)

Editar: estoy usando Rails 2.3 .4

Respuesta

10

Tendrás que hacer algunos parches Rails para hacer esto. Asegúrese de usar solo este código en desarrollo y/o prueba, ya que no desea que su aplicación genere errores si un usuario intenta asignar en masa. Me gustaría añadir lo siguiente a 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 

Esto elevará el aviso regular, pero también a plantear un RuntimeError con el mensaje "error de asignación de masas", cuando en entornos de prueba y desarrollo atributos protegidos en cualquier momento están en serie asignado . También puede modificar el mensaje de error o error en el código anterior si prefiere otra excepción.

Asegúrese de reiniciar su consola o servidor para que esto surta efecto.

P.S: En los carriles 2 que querrá hacer lo siguiente:

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 
+1

¿Por qué no quiero hacer esto en la producción? Es decir, si un usuario intenta asignar en masa, está tratando de hacer algo que va en contra de las reglas (en cuyo caso está bien si su solicitud explota) o he olvidado hacer accesible un atributo (en cuyo caso quiero saber al respecto). –

+0

Además, y lo siento por no mencionar en la pregunta, pero estoy usando Rails 2.3.4. ¿Qué cambios debo hacer en tu respuesta para que funcione en mi versión de Rails? –

+0

Está bien si lo hace, solo querrá detectar el error y manejarlo adecuadamente, no desea dejar a su usuario con 500 páginas de error y sin explicación. Por ejemplo, si el usuario intenta piratear su sitio, probablemente se le notifique cuando esto ocurra, y si olvidó establecer un atributo como accesible, eso es algo que necesita corregir. –

Cuestiones relacionadas