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
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
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
@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