2010-11-22 16 views
291

Supongamos que tengo la siguiente cadenaprima vs vs html_safe h a html unescape

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

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

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

?

Respuesta

366

rieles Considerando 3:

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

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

agregar el prefijo a su expresión con raw es en realidad equivalente a llamar to_s encadenado con html_safe en él, pero se declara en un ayudante, al igual que h, por lo que sólo se puede utilizar en controladores y vistas.

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

+39

No diría que 'h' alguna vez estará en desuso. Usar '" Hola
# {h @ user.name} ". Html_safe' es bastante común y un uso aceptado. – maletor

+1

@Maletor uso interesante, aunque todavía creo que entra en la categoría "inusual". –

+10

@ Fábio Batista No es raro en absoluto, aquí está en un Railscast en la parte inferior: http://asciicasts.com/episodes/204-xss-protection-in-rails-3 –

101

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

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

pondrá:

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

en su código fuente HTML (yay, tan seguro!), Mientras que:

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

emergerá el diálogo de alerta (¿está seguro de que es lo ¿usted quiere?). Por lo tanto, probablemente no desee llamar al html_safe en cualquier cadena ingresada por el usuario.

+63

En otras palabras, html_safe no es "por favor haga que este html sea seguro", es lo opuesto, es usted el programador quien le dice a rails que "esta cadena es segura en html, ¡lo prometo!" – PaulMurrayCbr

+8

realmente debería cambiarse a '.unescape_html' en el código fuente de los rieles ... – Magne

+0

en realidad vine aquí para descubrir si en realidad hace _unescape_ o si solo hace una marca que no es necesario _to_escape_. Toda una diferencia Ah, bueno, listo para leer el código fuente entonces. –

41

La diferencia es entre html_safe() y raw() de Rails. Hay un excelente mensaje por Yehuda Katz en esto, y lo que 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 de cadena y luego llama html_safe() en él. También es el caso 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".

1

En términos simples: Rieles

h etiquetas HTML en quitar caracteres numéricos de manera que la representación no se desintegrará su html

html_safe establece un valor lógico en la cadena para que la cadena se considera como HTML Guardar

raw convierte a html_safe a cadena

+0

'h' es' html_safe', lo que significa que el HTML se representa tal como está. –

19
  1. html_safe:

    Marca una cadena como segura de confianza. Se insertará en HTML sin realizar escapes adicionales.

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

    raw es sólo 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 etiquetas HTML. Use este método para escapar de cualquier contenido inseguro.

    En los carriles 3 y por encima de ella se utiliza por defecto, así que no es necesario utilizar este método de forma explícita

0

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

Se evitará XSS!

Cuestiones relacionadas