ti-enxame.com

raw vs. html_safe vs. h para unescape html

Suponha que eu tenha a seguinte string

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

Na minha opinião, quero que um link seja exibido. Ou seja, não quero que tudo em @x seja removido e exibido como uma string. Qual é a diferença entre usar

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

?

314
grautur

Considerando os trilhos 3:

html_safe na verdade "define a string" como HTML Safe (é um pouco mais complicado que isso, mas é basicamente isso). Dessa forma, você pode retornar seqüências de caracteres Seguras de HTML de ajudantes ou modelos à vontade.

h só pode ser usado dentro de um controller ou view, desde que seja de um helper. Isso forçará a saída a ser escapada. Não é realmente obsoleto, mas você provavelmente não vai mais usá-lo: o único uso é "reverter" uma declaração html_safe, bastante incomum.

Prefigurar sua expressão com raw é realmente equivalente a chamar to_s encadeado com html_safe, mas é declarado em um auxiliar, assim como h, portanto, ele só pode ser usado em controllers e views.

" SafeBuffers and Rails 3. " é uma boa explicação de como o SafeBuffers (a classe que faz a mágica html_safe) funciona.

381
Fábio Batista

Eu acho que vale a pena repetir: html_safe faz não HTML-escape sua string. Na verdade, isso impedirá que sua string seja escapada.

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

vai colocar:

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

em sua fonte HTML (yay, tão seguro!), enquanto:

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

irá aparecer o diálogo de alerta (você tem certeza de que é isso que você quer?). Então você provavelmente não quer chamar html_safe em nenhuma string inserida pelo usuário.

109
roasm

A diferença é entre html_safe() e raw() de Rails. Há um excelente post de Yehuda Katz sobre isso, e realmente se resume a isso:

def raw(stringish)

  stringish.to_s.html_safe

end

Sim, raw() é um wrapper em torno de html_safe() que força a entrada para String e depois chama html_safe() nela. Também é o caso que raw() é um auxiliar em um módulo, enquanto html_safe() é um método na classe String que cria uma nova instância do ActiveSupport :: SafeBuffer - que tem um sinalizador @dirty.

Consulte " Rails 'html_safe vs. raw ".

45
Pankhuri
  1. html_safe:

    Marca uma string como confiável. Ele será inserido no HTML sem nenhum escape adicional executado.

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

    raw é apenas um wrapper em torno de html_safe. Use raw se houver chances de que a string seja nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
    
  3. h alias para html_escape:

    Um método utilitário para escapar caracteres de tag HTML. Use este método para escapar de qualquer conteúdo inseguro.

    No Rails 3 e acima é usado por padrão, então você não precisa usar este método explicitamente

26
Deepak Mahakale

A melhor maneira segura é: <%= sanitize @x %>

Isso evitará o XSS!

9
Guilherme Y. Hatano

Em termos simples do Rails:

h remove tags html em caracteres numéricos para que o processamento não quebre o seu html

html_safe define um booleano em string para que a string seja considerada como html save

raw Converte para html_safe em string

1
user3118220