raw vs html seguro vs h a unescape html


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 no se escape y se muestre como una cadena. ¿Cuál es la diferencia entre usar

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

?

Author: jergason, 2010-11-23

6 answers

Considerando los Carriles 3:

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

h solo se puede usar desde un controlador o vista, ya que es de un helper. Forzará que la salida se escape. No es realmente obsoleto, pero lo más probable es que no lo use más: el único uso es "revertir" una declaración html_safe, bastante inusual.

Anteponer su expresión con raw es en realidad equivalente a llamar a to_s encadenado con html_safe en ella, pero se declara en un helper, 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 sobre cómo funciona SafeBuffer s (la clase que hace la magia html_safe).

 375
Author: Fábio Batista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-14 01:03:20

Creo que vale la pena repetir: html_safehace no HTML-escape 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 diálogo de alerta (¿estás seguro de que eso es lo que quieres?). Así que probablemente no quieras llamar a html_safe en ninguna cadena introducida por el usuario.

 106
Author: roasm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-29 18:57:16

La diferencia es entre Rails' html_safe() y raw(). 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() en ella. También es el caso de 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 una bandera @dirty en ella.

Refiérase a " html_safe de Rails vs. raw ".

 42
Author: Pankhuri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-12 23:53:42
  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 una envoltura 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 caracteres de etiqueta HTML. Utilice este método para escapar de cualquier contenido inseguro.

    En Rails 3 y superiores se utiliza de forma predeterminada, por lo que no es necesario utilizar este método explícitamente

 23
Author: Deepak Mahakale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-26 14:59:37

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

Evitará XSS!

 5
Author: Guilherme Y. Hatano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-31 23:00:31

En términos simples de Rails:

h elimine las etiquetas html en caracteres numéricos para que el renderizado no rompa su html

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

raw Convierte a html_safe a string

 1
Author: user3118220,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-26 08:35:32