7

Actualmente tengo un controlador que captura algunos html de TinyMCE en el extremo frontal. Si jugueteo con Firebug, es posible enviar etiquetas de script e inyectar mensajes de alerta, etc. a la pantalla.La mejor manera de desinfectar los campos en ruby ​​on rails

editar: Actualmente estoy arreglando esto en el modelo utilizando el ayudante de higienización:

require 'action_view' 

class NotesController < AuthApplicationController 

    include ActionView::Helpers::SanitizeHelper 
... 
    def update 
    params[:note][:content] = sanitize(params[:note][:content], 
     :tags => %w(a object p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 

    @note.update_attributes(params[:note]) 

Esto se siente desordenado en el controlador. ¿Hay una mejor manera? Es decir. de alguna manera, integrar este ActiveRecord para que pueda especificar fácilmente para hacer esto en este y otros campos antes de guardar de una manera similar a la validación?

Gracias por cualquier sugerencia.

editar:

Haciendo algunos progresos aquí.

Bajo mi/Liberaciones que tienen

module SanitizeUtilities 
    def sanitize_tiny_mce(field) 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 
end 

Luego, en mis modelos del código se derrumba a

class MyModel < ActiveRecord::Base 
    include ::SanitizeUtilities 
... 
    before_save :sanitize_content 
... 
    def sanitize_content 
    self.content = sanitize_tiny_mce(self.content) 
    end 

end 

Esto parece que se deben eliminar marcas no deseadas sin mucho alboroto.

Bastante nuevo en los rieles tan nervioso que podría estar haciendo algo mal. ¿Alguien puede ver posibles inconvenientes aquí?

Gracias de nuevo

+0

La forma más habitual de manejar esto en rieles es aceptar cualquier basura del cliente y guardarla (de forma segura, con cuidado para evitar la inyección de SQL). Luego, cuando llegue el momento de mostrar, desinfecte allí. – noodl

+2

Eso me parece extraño, ¿por qué querría enviar datos sucios? Eso aumentaría el trabajo y las posibilidades de perder una desinfección si volviera a leer los datos en múltiples lugares. – Chris

+0

@noodl Estoy de acuerdo con Chris en este caso. Excluir los datos por adelantado significa que solo tiene que incurrir en este proceso una vez. No eliminarlo significa que debe incurrir en este proceso cada vez que muestra los datos. Y como dijo Chris, es posible que olvide proteger una vista. – iwasrobbed

Respuesta

11

creo que la forma en que lo está haciendo está bien, pero si está utilizando before_save entonces usted podría potencialmente siguen sin validaciones (ya before_save se llama después de validaciones). Además, no necesariamente tiene que ponerlo en su propio módulo, podría ser un método privado en su clase.

Algo así como:

class MyModel < ActiveRecord::Base 

    before_validation :sanitize_content, :on => :create 

    private 
    def sanitize_content 
     self.content = sanitize_tiny_mce(self.content) 
    end 
    def sanitize_tiny_mce(field) 
     ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 

end 
+0

presumiblemente 'on: [: create,: update]' too ... otras mejores prácticas? – Meekohi

1

Esta cuestión parece ser respondidas, pero para cualquiera que venga a este es posible que desee considerar el uso de mutators personalizados para hacerlo más transparente. Algo como:

class MyModel < ActiveRecord::Base 
    def content= content 
    write_attribute(:content, sanitize_tiny_mce(content) 
    end 

    private 

    def sanitize_tiny_mce content 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data) 
    ); 
    end 
end 

Esto asegurará que el contenido se desinfecte cada vez que se modifique.

Cuestiones relacionadas