He estado usando el método de desinfección en una aplicación de Rails 4 para limpiar una página que muestra html que los usuarios generan para evitar cosas inseguras como la inyección de scripts. Entonces tengo una vista que se parece a:

sanitize @user_input

En este momento tengo problemas cuando los usuarios ingresan etiquetas de video con una etiqueta de origen debajo de esta manera:

<video><source src="foo.bar"></video>

Desafortunadamente, parece que sanitize está eliminando la etiqueta de origen, por lo que los videos ya no funcionan. ¿Cómo utilizo sanitize para que permita etiquetas de origen? Además, ¿cómo puedo obtener una lista de etiquetas que están permitidas / no permitidas? Sería genial entender lo que está pasando bajo el capó.

Para que quede completamente claro, me gustaría poder agregar la etiqueta de origen a la lista blanca. Cuando lo especifico como una etiqueta permitida en los argumentos para desinfectar, elimina todos los valores predeterminados anteriores para las etiquetas de la lista blanca. Por ejemplo, todavía me gustaría permitir etiquetas predeterminadas como a, h1, etc.

¿Cómo agrego la fuente a la lista blanca en lugar de completar su reemplazo?

2
slykat 28 ene. 2016 a las 22:34

4 respuestas

La mejor respuesta

Después de buscar en la fuente, descubrí que la lista de elementos predeterminados permitidos se basa en WhiteList Sanitize de Loofah

  • Etiquetas predeterminadas: Loofah::HTML5::WhiteList::ALLOWED_ELEMENTS_WITH_LIBXML2
  • Atributos predeterminados: Loofah::HTML5::WhiteList::ALLOWED_ATTRIBUTES

Entonces, para agregar <source> a la lista predeterminada, podría hacer lo siguiente:

default_tags = Loofah::HTML5::WhiteList::ALLOWED_ELEMENTS_WITH_LIBXML2.add('source')
default_attributes = Loofah::HTML5::WhiteList::ALLOWED_ATTRIBUTES
sanitize @user_input, tags: default_tags, attributes: default_attributes
3
Mr Lister 2 feb. 2016 a las 20:52

Consulte http://apidock.com/rails/ActionView/Helpers/SanitizeHelper/sanitize.

Puede proporcionar un hash de opción con las etiquetas que le gustaría incluir en la lista blanca de esta manera:

sanitize('<video><source src="foo.bar"></video>', tags: %w(video source))

No puedo encontrar si hay una manera de obtener la lista blanca completa desde la aplicación Rails, pero este es el código fuente del desinfectante predeterminado que se usa (consulte la clase WhiteListSanitizer):

https://github.com/rails/rails-html-sanitizer/blob/master/lib/rails/html/sanitizer.rb

Desde allí puede ver que las etiquetas permitidas son:

%w(strong em b i p code pre tt samp kbd var sub
    sup dfn cite big small address hr br div span h1 h2 h3 h4 h5 h6 ul ol li dl dt dd abbr
    acronym a img blockquote del ins)

Y los atributos permitidos son:

%w(href src width height alt cite datetime title class name xml:lang abbr)

Puede agregar video y source a la lista de etiquetas y proporcionársela al asistente sanitize.

1
hattenn 28 ene. 2016 a las 20:50

Puedes hacer algo como esto:

<%= sanitize @user_input, tags: %w(video source), attributes: %w(src) %>

1
uday 28 ene. 2016 a las 19:57

Al ajustar la lista blanca predeterminada:

attributes_whitelist = Rails::Html::Sanitizer.white_list_sanitizer.allowed_attributes
attributes_whitelist << 'source'
sanitize(@user_input, attributes: attributes_whitelist)
2
hlcs 30 oct. 2018 a las 09:58