362 Stimmen

raw vs. html_safe vs. h zu unescape html

Angenommen, ich habe die folgende Zeichenkette

@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 unescaped und als String angezeigt wird. Was ist der Unterschied zwischen der Verwendung von

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

?

404voto

Fábio Batista Punkte 24308

Überlegungen zu Rails 3:

html_safe setzt die Zeichenkette tatsächlich als HTML Safe (es ist etwas komplizierter als das, aber im Grunde ist es das). Auf diese Weise können Sie HTML-sichere Zeichenketten von Helfern oder Modellen nach Belieben zurückgeben.

h kann nur innerhalb eines Controllers oder Views verwendet werden, da es sich um einen Helper handelt. Es wird die Ausgabe erzwingen, um escaped werden. Es ist nicht wirklich veraltet, aber man wird es höchstwahrscheinlich nicht mehr verwenden: die einzige Verwendung ist das "Umkehren" einer html_safe Erklärung, ziemlich ungewöhnlich.

Voranstellen des Ausdrucks mit raw ist eigentlich gleichbedeutend mit dem Aufruf von to_s verkettet mit html_safe auf, sondern wird auf einer Hilfskraft deklariert, genau wie h und kann daher nur in Controllern und Views verwendet werden.

" SafeBuffers und Rails 3.0 " ist eine schöne Erklärung, wie die SafeBuffer s (die Klasse, die die html_safe Magie) funktionieren.

131voto

roasm Punkte 1363

Ich denke, es lohnt sich, dies zu wiederholen: html_safe hace no HTML-escape Ihre Zeichenfolge. Es wird sogar verhindern, dass Ihre Zeichenkette escaped wird.

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

setzen wird:

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

in Ihren HTML-Quelltext einfügen (juhu, so sicher!), während:

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

wird der Warndialog angezeigt (sind Sie sicher, dass Sie das wollen?). Sie wollen also wahrscheinlich nicht html_safe für alle vom Benutzer eingegebenen Zeichenfolgen.

53voto

Pankhuri Punkte 928

Der Unterschied besteht zwischen Rails' html_safe() y raw() . Es gibt einen ausgezeichneten Beitrag von Yehuda Katz zu diesem Thema, und es läuft wirklich auf Folgendes hinaus:

def raw(stringish)

  stringish.to_s.html_safe

end

Ja, raw() ist ein Wrapper um html_safe() das die Eingabe in String erzwingt und dann die html_safe() darauf. Es ist auch der Fall, dass raw() ist ein Hilfsmittel in einem Modul, während html_safe() ist eine Methode der String-Klasse, die eine neue ActiveSupport::SafeBuffer-Instanz erzeugt, die eine @dirty Flagge darin.

Siehe " Rails' html_safe vs. raw ".

41voto

Deepak Mahakale Punkte 20945
  1. html_safe :

    Markiert eine Zeichenfolge als vertrauenswürdig sicher. Sie wird in HTML eingefügt, ohne dass ein zusätzliches Escaping durchgeführt wird.

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

    raw ist nur ein Wrapper um html_safe . Verwenden Sie raw wenn die Möglichkeit besteht, dass die Zeichenfolge nil .

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

    Eine Utility-Methode für das Escaping von HTML-Tag-Zeichen. Verwenden Sie diese Methode, um unsichere Inhalte zu escapen.

    In Rails 3 und höher wird sie standardmäßig verwendet, so dass Sie diese Methode nicht explizit verwenden müssen

28voto

Das ist der sicherste Weg: <%= sanitize @x %>

Dadurch wird XSS vermieden!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X