Desinfectar Rails Gem: cómo incluirlo en la lista blanca y

Ahora mismo estamos usando la gema desinfectante: https://github.com/rgrove/sanitize

El problema es si ingresas "hello & world"desinfectar es guardar eso en la base de datos como:

hello & world 

¿Cómo se puede incluir en la lista blanca & . Queremos desinfectar para eliminar todas las posibles etiquetas html y JS / script maliciosas. pero estamos bien permitiendo el ampersand.

Ideas? Gracias

preguntado el 08 de noviembre de 11 a las 19:11

Puede ser Sanitize.clean (html, Sanitize :: Config :: RELAXED) # => '&' -

Gracias, pero RELAXED permite casi todo. Me gustaría incluirlo en la lista blanca y no puedo averiguar cómo.

@ bilash.saha La configuración relajada seguirá siendo html-escape entidades, lo que publiques seguirá mostrando "Hola y mundo" -

Utilizar Loofah - está integrado y es perfecto :) -

5 Respuestas

Sanitize siempre transformará lo que se genera en entidades html para html / xhtml válido.

La mejor manera que puedo determinar es filtrar la salida

Sanitize.fragment("hello & world").gsub('&','&') #=> "Hello & world"

respondido 09 mar '19, 02:03

Esto resolvería el carácter &, pero no escalaría a todos los caracteres que el motor html utilizado convertirá en entidades. Tratar de hacer un seguimiento de todo eso también sería un dolor de cabeza. La respuesta de @ agustin a continuación es una mejor solución en mi opinión: Shyam Habarakada

@ShyamHabarakada El problema que tengo con el sistema integrado de Rails sanitize() y strip_tags, es que no corrigen el marcado con formato incorrecto, por lo que una < carácter puede destruir el diseño de la página. strip_tags('Strip <ithese tags') #=> "Strip <ithese tags", pero esto está fuera de lo que pedía la pregunta: una forma de desinfectar, pero aún permitir los símbolos de unión crudos. - Unixmonkey

Es cierto eso, sobre el marcado con formato incorrecto. Limpiamos principalmente como una forma de evitar que HTML ingrese en parámetros que no deberían tener HTML. Eliminar etiquetas a través de strip_tags integrado funciona bien para nosotros en eso. Parece que ese también es el escenario en esta pregunta. Estoy de acuerdo, si desea una desinfección completa, se necesita una mejor solución que tenga un motor DOM adecuado. Pero para la desinfección de parámetros, en mi opinión, parece una exageración. - Shyam Habarakada

respondido 09 nov., 11:07

Esta parece ser la solución correcta para la pregunta (y el problema con el que también me encontré): Shyam Habarakada

A partir de rails-html-sanitizer v1.0.3, strip_tags () escapa & as & github.com/rails/rails-html-sanitizer/issues/28 - Andrew Hood

La respuesta de UnixMonkey es lo que terminamos haciendo.

def remove_markup(html_str)
    marked_up = Sanitize.clean html_str

    ESCAPE_SEQUENCES.each do |esc_seq, ascii_seq|
      marked_up = marked_up.gsub('&' + esc_seq + ';', ascii_seq.chr)
    end
    marked_up
  end

Donde ESCAPE_SEQUENCES era una matriz de los caracteres que no queríamos que se escaparan.

Respondido 15 Feb 12, 02:02

A partir de Rails 4.2, #strip_tags no descodifica caracteres especiales HTML

strip_tags("fun & co")
  => "fun &amp; co"

De lo contrario, obtendría lo siguiente:

strip_tags("&lt;script&gt;")
  => "<script>"

Si solo desea el ampersand, le sugiero que filtre la salida como sugirió @Unixmonkey y manténgala en & , de manera

strip_tags("<bold>Hello & World</bold>").gsub(/&amp;/, "&")
  => "Hello & World"

Respondido 08 Feb 17, 23:02

Ninguna de las otras respuestas funcionó para mí. El mejor enfoque que encontré para mi caso de uso fue usar el integrado esponja vegetal joya:

good = '&'
bad = "<script>alert('I am evil');</script>"
greater_than = '>' # << my use case

Loofah.fragment(good).text(encode_special_chars: false)
# => "&"
Loofah.fragment(greater_than).text(encode_special_chars: false)
# => ">"

Loofah.fragment(bad).text(encode_special_chars: false)
# => "alert('I am evil');"

# And just for clarity, without the option passed in:
Loofah.fragment(good).text
# => "&amp;"

Sin embargo, no es impecable, así que ten mucho cuidado:

really_bad = "&lt;script&gt;alert('I am evil');&lt;/script&gt;"
Loofah.fragment(really_bad).text(encode_special_chars: false)
# => "<script>alert('I am evil');</script>"

Más información sobre el método especificado aquí.

¡Definitivamente el enfoque más eficiente para lo que necesitaba hacer!

Respondido el 06 de diciembre de 19 a las 18:12

Cuando dices "integrado", ¿a qué te refieres? ¿Está integrado en Rails? Parece una joya como desinfectar, que no es lo que yo consideraría integrado. - Dan

Está incluido con Rails @Dan. gem dependency loofah --reverse-dependencies te da (entre otros): Used by rails-html-sanitizer-1.3.0 (loofah (~> 2.3)). Esa gema en sí está integrada en Rails, mira aquí: "En Rails 4.2 y superior, esta joya será responsable de desinfectar los fragmentos HTML en las aplicaciones Rails". - SRack

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.