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 %>
?
ruby-on-rails
erb
grautur
fonte
fonte
<%== @x %>
que existe um pseudônimo para<%= raw(@x) %>
edgeguides.rubyonrails.org/…Respostas:
Considerando o Rails 3:
html_safe
na 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.h
só 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" umahtml_safe
declaração, bastante incomum.Anexar sua expressão com
raw
é equivalente a chamarto_s
encadeado comhtml_safe
ela, mas é declarado em um auxiliar, assim comoh
, para que possa ser usado apenas em controladores e visualizações." SafeBuffers and Rails 3.0 " é uma boa explicação sobre como os
SafeBuffer
s (a classe que faz ahtml_safe
mágica) funcionam.fonte
h
será reprovado. O uso"Hi<br/>#{h@ user.name}".html_safe
é bastante comum e um uso aceito.raw
ehtml_safe
na prática:raw(nil)
retorna uma string vazia, enquantonil.html_safe
lança uma exceção.h
não "reverterá" uma declaração html_safe. Quando uma string éhtml_safe
,h
não fará nada.Eu acho que vale a pena repetir:
html_safe
o HTML não escapa à sua string. De fato, isso impedirá que sua string seja escapada.vai colocar:
em sua fonte HTML (yay, tão seguro!), enquanto:
aparecerá a caixa de diálogo de alerta (você tem certeza de que é isso que deseja?). Portanto, você provavelmente não deseja chamar
html_safe
nenhuma string inserida pelo usuário.fonte
html_safe
se 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. #A diferença é entre Rails
html_safe()
eraw()
. Há um excelente post de Yehuda Katz sobre isso, e realmente se resume a isso:Sim,
raw()
é um invólucrohtml_safe()
que força a entrada a String e depois a chamahtml_safe()
. Também é o caso deraw()
um auxiliar em um módulo, enquantohtml_safe()
é um método na classe String que cria uma nova instância do ActiveSupport :: SafeBuffer - que possui um@dirty
sinalizador.Consulte " html_safe vs. bruto do Rails ".
fonte
html_safe
:Marca uma string como segura e confiável. Ele será inserido no HTML sem que haja escape adicional.
raw
:raw
é apenas um invólucrohtml_safe
. Useraw
se houver chances de que a sequência sejanil
.h
alias parahtml_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
fonte
A melhor maneira segura é:
<%= sanitize @x %>
Isso evitará o XSS!
fonte
Em termos do Simple Rails:
h
remova tags html em caracteres numéricos para que a renderização não interrompa seu htmlhtml_safe
define um string booleano para que o string seja considerado como html saveraw
Ele converte em html_safe em stringfonte
h
éhtml_safe
, o que significa que o HTML é renderizado no estado em que se encontra.