raw vs. html_safe vs. h per annullare l'escape dell'html


323

Supponiamo che io abbia la seguente stringa

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

A mio avviso, voglio che sia visualizzato un collegamento. Cioè, non voglio che tutto in @x sia senza escape e visualizzato come una stringa. Qual è la differenza tra l'utilizzo

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

?


Dato che nessuno l'ha menzionato, ho pensato di menzionare anche <%== @x %>che c'è un alias per <%= raw(@x) %> edgeguides.rubyonrails.org/…
CTS_AE

Risposte:


386

Considerando Rails 3:

html_safein realtà "imposta la stringa" come HTML sicuro (è un po 'più complicato di così, ma sostanzialmente lo è). In questo modo, puoi restituire stringhe HTML Safe da helper o modelli a piacimento.

hpuò essere utilizzato solo all'interno di un controller o di una vista, poiché proviene da un helper. Forzerà l'uscita dell'uscita. Non è davvero deprecato, ma molto probabilmente non lo userai più: l'unico uso è "ripristinare" una html_safedichiarazione, abbastanza insolita.

Preparare la tua espressione con rawè in realtà equivalente a chiamare to_sincatenato con html_safeesso, ma è dichiarato su un helper, proprio come h, quindi può essere utilizzato solo su controller e viste.

" SafeBuffers and Rails 3.0 " è una bella spiegazione di come funziona la SafeBuffers (la classe che fa la html_safemagia).


42
Non direi che hsarà mai deprecato. L'uso "Hi<br/>#{h@ user.name}".html_safeè abbastanza comune e un uso accettato.
Maletor,

1
@Maletor utilizzo interessante, anche se penso ancora che rientri nella categoria "insolita".
Fábio Batista,

5
La stringa # html_safe restituisce effettivamente un'istanza di ActiveSupport :: SafeBuffer che avvolge la stringa originale ed è #html_safe? . La stringa originale non diventa #html_safe? dopo aver chiamato #html_safe su di esso.
jmaxyz,

9
Si noti che esiste una sottile differenza tra rawe html_safein pratica: raw(nil)restituisce una stringa vuota, mentre nil.html_safegenera un'eccezione.
Van der Hoorn,

2
hnon "ripristinerà" una dichiarazione html_safe. Quando una stringa è html_safe, hnon farà nulla.
GuiGS,

113

Penso che vale la pena ripeterlo: html_safenon non HTML-escape stringa. In effetti, eviterà la fuga della stringa.

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

metterà:

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

nel tuo sorgente HTML (yay, so safe!), mentre:

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

apparirà la finestra di avviso (sei sicuro che è quello che vuoi?). Quindi probabilmente non vuoi chiamare html_safenessuna stringa immessa dall'utente.


81
In altre parole, html_safe non è "per favore, rendi questo html sicuro", è il contrario - sei tu il programmatore che dice a Rails che "questa stringa è html sicura, prometti!"
PaulMurrayCbr

in realtà sono venuto qui per capire se effettivamente scappa o fa solo un segno che non è necessario scappare . Piuttosto una differenza. Vabbè, vado a leggere il codice sorgente allora.
Simon B.

Il concetto di "html_safe" è solo un meta flag sulla stringa. Marcatura qualcosa di così html_safenon non sfugge unescape. Mentre il risultato finale di contrassegnare qualcosa come non HTML sicuro, e quindi usare l'escape implicita del tag ERB <% =, potrebbe essere lo stesso dei dati di escape e poi di ri-escape sull'output, funzionalmente non sta facendo nessuno dei due. Un po 'come la differenza di (6 * -1 * -1), contro 6.
Ben Zittlau,

46

La differenza è tra Rails ' html_safe()e raw(). C'è un eccellente post di Yehuda Katz su questo, e si riduce davvero a questo:

def raw(stringish)

  stringish.to_s.html_safe

end

Sì, raw()è un wrapper html_safe()che forza l'input su String e quindi lo chiama html_safe(). È anche il caso di raw()un helper in un modulo mentre html_safe()è un metodo sulla classe String che crea una nuova istanza di ActiveSupport :: SafeBuffer - che contiene un @dirtyflag.

Fare riferimento a " html_safe vs raw di Rails ".


30
  1. html_safe :

    Contrassegna una stringa come sicura attendibile. Verrà inserito in HTML senza ulteriore escape eseguito.

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

    rawè solo un involucro in giro html_safe. Utilizzare rawse ci sono possibilità che la stringa sia nil.

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

    Un metodo di utilità per sfuggire ai caratteri tag HTML. Utilizzare questo metodo per evitare qualsiasi contenuto non sicuro.

    In Rails 3 e versioni successive viene utilizzato per impostazione predefinita, quindi non è necessario utilizzare questo metodo in modo esplicito



2

In termini di Simple Rails:

h rimuovi i tag html in caratteri numerici in modo che il rendering non interrompa il tuo html

html_safe imposta un valore booleano nella stringa in modo che la stringa sia considerata come html save

raw Converte in html_safe in stringa


hè html_safe, il che significa che l'HTML è reso così com'è.
Dave Newton,

La risposta è corretta: h è html_escape ... dalla base di codice di Rails
notapatch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.