raw vs. html_safe vs. h para remover html

323

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 no @x seja capturado sem escape e exibido como uma string. Qual é a diferença entre usar

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

?

grautur
fonte
Como ninguém o mencionou, achei que também mencionaria <%== @x %>que existe um pseudônimo para <%= raw(@x) %> edgeguides.rubyonrails.org/…
CTS_AE

Respostas:

386

Considerando o Rails 3:

html_safena verdade, "define a string" como HTML seguro (é um pouco mais complicado que isso, mas é basicamente isso). Dessa forma, você pode retornar seqüências de caracteres HTML seguras de auxiliares ou modelos à vontade.

hsó pode ser usado em um controlador ou exibição, pois é de um auxiliar. Isso forçará a saída da saída. Não está realmente obsoleto, mas você provavelmente não o usará mais: o único uso é "reverter" uma html_safedeclaração, bastante incomum.

Anexar sua expressão com rawé equivalente a chamar to_sencadeado com html_safeela, mas é declarado em um auxiliar, assim como h, para que possa ser usado apenas em controladores e visualizações.

" SafeBuffers and Rails 3.0 " é uma boa explicação sobre como os SafeBuffers (a classe que faz a html_safemágica) funcionam.

Fábio Batista
fonte
42
Eu não diria que isso hserá reprovado. O uso "Hi<br/>#{h@ user.name}".html_safeé bastante comum e um uso aceito.
maletor
1
@ Maletor uso interessante, embora eu ainda acho que se enquadra na categoria "incomum".
Fábio Batista
5
A string # html_safe realmente retorna uma instância do ActiveSupport :: SafeBuffer que agrupa a string original e é #html_safe? . A sequência original não se torna #html_safe? depois de chamar #html_safe.
precisa saber é
9
Observe que há uma diferença sutil entre rawe html_safena prática: raw(nil)retorna uma string vazia, enquanto nil.html_safelança uma exceção.
Van der Hoorn
2
hnão "reverterá" uma declaração html_safe. Quando uma string é html_safe, hnão fará nada.
GuiGS
113

Eu acho que vale a pena repetir: html_safeo HTML não escapa à sua string. De fato, 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 %>

aparecerá a caixa de diálogo de alerta (você tem certeza de que é isso que deseja?). Portanto, você provavelmente não deseja chamar html_safenenhuma string inserida pelo usuário.

roasm
fonte
81
Em outras palavras, html_safe não é "por favor, torne este html seguro", é o oposto - é você o programador que diz aos trilhos que "essa string é html segura, prometa!"
PaulMurrayCbr
na verdade eu vim aqui para descobrir se ele realmente faz unescape ou se ele só faz uma marca que não é necessário to_escape . Quanta diferença. Oh, bem, pronto para ler o código fonte então.
Simon B.
O conceito de "html_safe" é apenas uma meta flag na string. Marcação algo como html_safese não escapar nem unescape. Embora o resultado final de marcar algo como não seguro para HTML e, em seguida, usar a fuga implícita da tag ERB <% =, possa ser o mesmo que remover dados que não podem ser escapados e depois escapá-los novamente na saída, funcionalmente isso não acontece. É como a diferença de (6 * -1 * -1), vs. 6. #
Ben Zittlau
46

A diferença é entre Rails html_safe()e raw(). 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 invólucro html_safe()que força a entrada a String e depois a chama html_safe(). Também é o caso de 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 possui um @dirtysinalizador.

Consulte " html_safe vs. bruto do Rails ".

Pankhuri
fonte
30
  1. html_safe :

    Marca uma string como segura e confiável. Ele será inserido no HTML sem que haja escape adicional.

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

    rawé apenas um invólucro html_safe. Use rawse houver chances de que a sequência seja nil.

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

    Um método utilitário para escape de caracteres de tag HTML. Use este método para escapar de qualquer conteúdo não seguro.

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

Deepak Mahakale
fonte
14

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

Isso evitará o XSS!

Guilherme Y. Hatano
fonte
2

Em termos do Simple Rails:

h remova tags html em caracteres numéricos para que a renderização não interrompa seu html

html_safe define um string booleano para que o string seja considerado como html save

raw Ele converte em html_safe em string

user3118220
fonte
hé html_safe, o que significa que o HTML é renderizado no estado em que se encontra.
Dave Newton
A resposta está correta: h é html_escape ... a partir da base de código Rails
notapatch