ruby on rails - formularios - La mejor manera de desinfectar los campos en ruby on rails
formularios en ruby on rails (2)
Actualmente tengo un controlador que captura algunos html de TinyMCE en la interfaz. Si jugueteo con Firebug, es posible enviar etiquetas de script e inyectar mensajes de alerta, etc. a la pantalla.
edit: actualmente estoy arreglando esto en el modelo usando el sanitize helper:
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 integro este ActiveRecord para que pueda especificar fácilmente hacer esto en este y otros campos antes de guardarlo de forma similar a la validación.
Gracias por cualquier sugerencia.
editar:
Haciendo algunos progresos aquí.
En mi / Libs tengo
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, el código colapsa para
class MyModel < ActiveRecord::Base
include ::SanitizeUtilities
...
before_save :sanitize_content
...
def sanitize_content
self.content = sanitize_tiny_mce(self.content)
end
end
Esto parece eliminar el marcado no deseado sin demasiado alboroto.
Muy nuevo en los rieles tan nervioso que podría estar haciendo algo mal. ¿Alguien puede ver posibles inconvenientes aquí?
Gracias de nuevo
Creo que la forma en que lo está haciendo está bien, pero si está utilizando before_save
, es posible que todavía falle las validaciones (ya que se llama a before_save
después de las validaciones). Además, no necesariamente tiene que ponerlo en su propio módulo, podría ser un método privado en su clase.
Algo 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
Parece que esta pregunta es respondida, pero para cualquiera que esté interesado en esto, quizás desee considerar el uso de mutadores personalizados para que esto sea 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.