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 %>
?
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 un envoltorio 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 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á:
<script>alert('Hello!')</script>
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
).