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 %>
?
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
).
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_safe
hace no HTML-escape de su cadena. De hecho, evitará que su cadena se escape.
<%= "<script>alert('Hello!')</script>" %>
Pondrá:
<script>alert('Hello!')</script>
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.
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 ".
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
-
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
-
raw
:raw
es solo una envoltura alrededor dehtml_safe
. Useraw
si hay posibilidades de que la cadena seanil
.raw("<a>Hello</a>") #=> "<a>Hello</a>" raw(nil) #=> ""
-
h
alias parahtml_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
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!
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
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