Angenommen, ich habe die folgende Zeichenfolge
@x = "<a href='#'>Turn me into a link</a>"
Meiner Ansicht nach soll ein Link angezeigt werden. Das heißt, ich möchte nicht, dass alles in @x entkoppelt und als Zeichenfolge angezeigt wird. Was ist der Unterschied zwischen der Verwendung
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
ruby-on-rails
erb
grautur
quelle
quelle
<%== @x %>
es einen Alias für<%= raw(@x) %>
edgeguides.rubyonrails.org/…Antworten:
Betrachtung der Schienen 3:
html_safe
"setzt den String" als HTML-sicher (es ist etwas komplizierter, aber im Grunde ist es das). Auf diese Weise können Sie nach Belieben HTML-sichere Zeichenfolgen von Helfern oder Modellen zurückgeben.h
kann nur innerhalb eines Controllers oder einer Ansicht verwendet werden, da es von einem Helfer stammt. Dadurch wird erzwungen, dass die Ausgabe maskiert wird. Es ist nicht wirklich veraltet, aber Sie werden es höchstwahrscheinlich nicht mehr verwenden: Die einzige Verwendung besteht darin, einehtml_safe
Deklaration "zurückzusetzen" , was ziemlich ungewöhnlich ist.Das Voranstellen Ihres Ausdrucks mit
raw
ist eigentlich gleichbedeutend mit dem Aufruf vonto_s
verkettet mithtml_safe
, wird jedoch wie bei einem Helfer deklarierth
, sodass er nur für Controller und Ansichten verwendet werden kann." SafeBuffers and Rails 3.0 " ist eine nette Erklärung, wie das
SafeBuffer
s (die Klasse, die diehtml_safe
Magie macht) funktioniert.quelle
h
das jemals veraltet sein wird. Die Verwendung"Hi<br/>#{h@ user.name}".html_safe
ist weit verbreitet und wird akzeptiert.raw
undhtml_safe
in der Praxis gibt:raw(nil)
Gibt eine leere Zeichenfolge zurück, währendnil.html_safe
eine Ausnahme ausgelöst wird.h
wird eine html_safe-Deklaration nicht "zurücksetzen". Wenn eine Zeichenfolge isthtml_safe
,h
wird nichts tun.Ich denke , es trägt zu wiederholen:
html_safe
nicht nicht HTML-entkommen Zeichenfolge. Tatsächlich wird verhindert, dass Ihre Zeichenfolge maskiert wird.wird setzen:
in Ihre HTML-Quelle (yay, so sicher!), während:
öffnet den Alarmdialog (sind Sie sicher, dass Sie das möchten?). Sie möchten also wahrscheinlich
html_safe
keine vom Benutzer eingegebenen Zeichenfolgen aufrufen .quelle
html_safe
das weder entkommt noch entkommt. Das Endergebnis, wenn etwas als nicht HTML-sicher markiert und dann das implizite Escapezeichen des ERB <% = -Tags verwendet wird, entspricht möglicherweise dem Entschlüsseln von Daten und dem erneuten Escapezeichen bei der Ausgabe. Funktionell funktioniert dies jedoch nicht. Ein bisschen wie der Unterschied von (6 * -1 * -1) gegen 6.Der Unterschied liegt zwischen Rails
html_safe()
undraw()
. Es gibt einen ausgezeichneten Beitrag von Yehuda Katz dazu, und es läuft wirklich darauf hinaus:Ja, es
raw()
handelt sich um einen Wrapperhtml_safe()
, der die Eingabe in String erzwingt und dann aufrufthtml_safe()
. Es ist auch der Fall, dassraw()
es sich um einen Helfer in einem Modul handelt, währendhtml_safe()
es sich um eine Methode für die String-Klasse handelt, mit der eine neue ActiveSupport :: SafeBuffer-Instanz erstellt wird@dirty
Flag enthält.Siehe " Rails 'html_safe vs. raw ".
quelle
html_safe
::Markiert eine Zeichenfolge als vertrauenswürdig. Es wird in HTML eingefügt, ohne dass ein zusätzliches Escapezeichen ausgeführt wird.
raw
::raw
ist nur eine Hülle herumhtml_safe
. Verwenden Sieraw
diese Option, wenn die Wahrscheinlichkeit besteht, dass die Zeichenfolge angezeigt wirdnil
.h
Alias fürhtml_escape
:Eine Dienstprogrammmethode zum Escapezeichen von HTML-Tag-Zeichen. Verwenden Sie diese Methode, um unsichere Inhalte zu umgehen.
In Rails 3 und höher wird es standardmäßig verwendet, sodass Sie diese Methode nicht explizit verwenden müssen
quelle
Der beste sichere Weg ist:
<%= sanitize @x %>
Es wird XSS vermeiden!
quelle
In Simple Rails-Begriffen:
h
Entfernen Sie HTML-Tags in Zahlenzeichen, damit das Rendern Ihr HTML nicht beschädigthtml_safe
Setzt einen Booleschen Wert in der Zeichenfolge, sodass die Zeichenfolge als HTML-Speicher betrachtet wirdraw
Es konvertiert in html_safe in stringquelle
h
isthtml_safe
, was bedeutet, dass der HTML-Code so wie er ist gerendert wird.