working rails not html_safe ruby-on-rails erb

ruby-on-rails - not - .html_safe rails



raw vs. html_safe vs. h para unescape html (6)

Supongamos que tengo la siguiente cadena

@x = "<a href=''#''>Turn me into a link</a>"

En mi opinión, quiero que se muestre un enlace. Es decir, no quiero que todo en @x se salve y se muestre como una cadena. ¿Cuál es la diferencia entre usar

<%= raw @x %> <%= h @x %> <%= @x.html_safe %>

?


  1. html_safe :

    Marca una cadena como segura de confianza. Se insertará en HTML sin realizar ningún escape adicional.

    "<a>Hello</a>".html_safe #=> "<a>Hello</a>" nil.html_safe #=> NoMethodError: undefined method `html_safe'' for nil:NilClass

  2. raw

    raw es solo un envoltorio alrededor de html_safe . Use raw si hay posibilidades de que la cadena sea nil .

    raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""

  3. h alias para html_escape :

    Un método de utilidad para escapar de caracteres de etiquetas HTML. Utilice este método para escapar de cualquier contenido inseguro.

    En Rails 3 y versiones posteriores se usa de forma predeterminada, por lo que no es necesario usar este método explícitamente


Creo que vale la html_safe repetir: html_safe no html_safe HTML de su cadena. De hecho, evitará que su cadena se escape.

<%= "<script>alert(''Hello!'')</script>" %>

pondrá:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

en su fuente HTML (yay, tan seguro!), mientras que:

<%= "<script>alert(''Hello!'')</script>".html_safe %>

aparecerá el cuadro de diálogo de alerta (¿estás seguro de que eso es lo que quieres?). Probablemente no quieras llamar a html_safe en ninguna cadena ingresada por el usuario.


En términos de Rails simples:

h elimina las etiquetas html en caracteres numéricos para que la representación no rompa tu html

html_safe establece un valor booleano en cadena para que la cadena se considere como html save

raw Se convierte a html_safe a cadena


La diferencia está entre el html_safe() y el raw() Rails. Hay un excelente post de Yehuda Katz sobre esto, y realmente se reduce a esto:

def raw(stringish) stringish.to_s.html_safe end

Sí, raw() es una envoltura alrededor de html_safe() que fuerza la entrada a String y luego llama a html_safe() . También es cierto que raw() es un ayudante en un módulo, mientras que html_safe() es un método en la clase String que crea una nueva instancia de ActiveSupport :: SafeBuffer, que tiene un indicador @dirty .

Consulte " Rails ''html_safe vs. raw ".


La mejor manera segura es: <%= sanitize @x %>

¡Evitará XSS!


Teniendo en cuenta Rails 3:

html_safe realidad "establece la cadena" como HTML Safe (es un poco más complicado que eso, pero básicamente lo es). De esta manera, puede devolver cadenas seguras HTML de ayudantes o modelos a voluntad.

h solo se puede utilizar desde un controlador o vista, ya que es de un ayudante. Forzará la salida a escapar. Realmente no está en desuso, pero lo más probable es que no lo uses más: el único uso es "revertir" una declaración html_safe , bastante inusual.

La suspensión de la expresión con raw es en realidad equivalente a llamar to_s encadenada con html_safe , pero se declara en un ayudante, al igual que h , por lo que solo se puede usar en controladores y vistas.

" SafeBuffers and Rails 3.0 " es una buena explicación de cómo funciona SafeBuffer s (la clase que hace la magia html_safe ).