2009-03-28 15 views
78

Ich habe eine nicht vertrauenswürdige Zeichenfolge, die ich als Text in einer HTML-Seite anzeigen möchte. Ich muss die Zeichen < 'und' & 'als HTML-Entitäten entkommen. Je weniger Aufhebens um so besser.Wie HTML codieren/escape eine Zeichenfolge? Gibt es eine eingebaute?

Ich benutze UTF8 und brauche keine anderen Entitäten für akzentuierte Buchstaben.

Gibt es eine eingebaute Funktion in Ruby oder Rails, oder sollte ich meine eigene rollen?

+2

[Nach dem OWASP] (https: //www.owasp. org/index.php/XSS_ (Cross_Site_Scripting) _Prevention_Cheat_Sheet # RULE_.231 _-_ HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content), sollten die folgenden sechs Zeichen für einen korrekten XSS-Schutz im HTML-Element Inhalt maskiert werden: '& <> '' /' – sffc

Antwort

77

Die h Hilfsmethode:

<%=h "<p> will be preserved" %> 
+0

Nun, es entkommt auch> Das ist unnötig, aber es wird machen. – kch

+0

Sie können Klammern verwenden, um einige mit h und einige ohne zu drucken. <% = h ("" "> –

+0

Nun, das wäre albern. Es ist mir egal, ob es entkommt oder nicht. Ich merke nur, dass es nicht gemäß den HTML-Spezifikationen erforderlich ist. – kch

13

können Sie verwenden entweder h() oder html_escape(), aber die meisten Menschen h() vereinbarungsgemäß verwenden. h() ist die Abkürzung für html_escape() in Schienen.

In Ihrem Controller:

@stuff = "<b>Hello World!</b>" 

Ihrer Ansicht:

<%=h @stuff %> 

Wenn Sie die HTML-Quelle anzuzeigen: Sie erhalten die Ausgabe anzuzeigen, ohne die Daten Bolding. I.e. Es ist codiert als &lt;b&gt;Hello World!&lt;/b&gt;.

Es erscheint ein als <b>Hello World!</b>

121

Kasse CGI Klasse Ruby angezeigt. Es gibt Methoden, um HTML und URLs zu kodieren und zu dekodieren.

+9

Danke, das ist großartig, da es von den Controllern gemacht werden kann Natürlich würde das nicht tun –

+2

Dies ist nützlich in funktionalen/Integrationstests, um die Korrektheit von Inhalt zu überprüfen, der in eine Vorlage eingefügt wird (wenn der c Ontent soll HTML-maskiert sein). –

+0

Wenn der Inhalt auf einer Kundenwebsite angezeigt wird, anders als Ihre eigene (wo Sie die Ansicht nicht kontrollieren können), was ist das Problem beim Entkommen des HTML vor dem Einfügen in die Datenbank? Gibt es noch eine andere Arbeit? – n00b

70

In Ruby on Rails 3 HTML wird standardmäßig maskiert.

Für nicht entkommen Strings verwenden:

<%= raw "<p>hello world!</p>" %> 
+0

wirkt wie ein Zauber. Vielen Dank. –

+0

genau das, was ich gesucht habe, danke. – GnrlBzik

0

h() für die Flucht zitiert auch nützlich ist.

Zum Beispiel habe ich eine Ansicht, die eine Verknüpfung mit einem Textfeld result[r].thtitle erzeugt. Der Text könnte einfache Anführungszeichen enthalten. Wenn ich nicht result[r].thtitle im confirm Verfahren entging, würde die Javascript brechen:

&lt;%= link_to_remote "#{result[r].thtitle}", :url=>{ :controller=>:resource, 
:action   =>:delete_resourced, 
:id  => result[r].id, 
:th  => thread,                          
:html  =>{:title=> "<= Remove"},              
:confirm => h("#{result[r].thtitle} will be removed"),             
:method  => :delete %> 

&lt;a href="#" onclick="if (confirm('docs: add column &amp;apos;dummy&amp;apos; will be removed')) { new Ajax.Request('/resource/delete_resourced/837?owner=386&amp;th=511', {asynchronous:true, evalScripts:true, method:'delete', parameters:'authenticity_token=' + encodeURIComponent('ou812')}); }; return false;" title="&lt;= Remove">docs: add column 'dummy'</a> 

Hinweis: Die :html Titel Erklärung auf magische Weise entkam durch Rails.

13

Eine Ergänzung zu Christopher Bradford Antwort überall den HTML-Code zu verwenden, zu entkommen, da die meisten Menschen CGI nicht verwenden heutzutage, können Sie auch Rack verwenden:

require 'rack/utils' 
Rack::Utils.escape_html('Usage: foo "bar" <baz>') 
+0

Es funktioniert mit Garnelen. Vielen Dank. – zezim

+0

Gibt es eine bessere Möglichkeit, Strings auf ähnliche Weise in Modellinstanzmethoden zu umgehen? –

22

ERB::Util.html_escape überall eingesetzt werden kann. Es ist ohne Verwendung von require in Rails verfügbar.

+0

Dies ist tatsächlich mit 'CGI.escapeHTML' unter – akostadinov

+0

@akostadinov - das Ergebnis ist jedoch anders. Zum Beispiel wird ERB :: Util.html_escape Apostrophe in ' drehen, während CGI :: escapeHTML nicht –

+0

@LouisSayers ist, kann ich nicht sehen, wie das passieren kann: '' ' [43] pry (main)> show- Quelle ERB :: Util.html_escape von: /usr/share/ruby/erb.rb @ line 945: Besitzer: # Sichtbarkeit: public Zeilenzahl: 3 def html_escape (s) CGI.escapeHTML (s.to_s) Ende '' ' – akostadinov

2

Comparaison der verschiedenen Methoden:

> CGI::escapeHTML("quote ' double quotes \"") 
=> "quote &#39; double quotes &quot;" 

> Rack::Utils.escape_html("quote ' double quotes \"") 
=> "quote &#x27; double quotes &quot;" 

> ERB::Util.html_escape("quote ' double quotes \"") 
=> "quote &#39; double quotes &quot;" 

schrieb ich meine eigenen kompatibel zu sein mit Rails ActiveMailer entkommen:

def escape_html(str) 
    CGI.escapeHTML(str).gsub("&#39;", "'") 
end