2009-03-28 5 views
78

Ho una stringa non attendibile che voglio mostrare come testo in una pagina HTML. Ho bisogno di sfuggire ai caratteri "<" e "&" come entità HTML. Meno complicato è, meglio è.Come codificare/uscire da una stringa HTML? C'è un built-in?

Sto usando UTF8 e non ho bisogno di altre entità per le lettere accentate.

Esiste una funzione incorporata in Ruby o Rails o devo eseguire il rollover?

+2

[Secondo l'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), i seguenti sei caratteri devono essere sottoposti a escape per la corretta protezione XSS nel contenuto dell'elemento HTML: '& <>" '/ ' – sffc

risposta

77

Il metodo h helper:

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

Bene, sfugge anche> , che non è necessario, ma lo sarà fare. – kch

+0

È possibile utilizzare le parentesi per stampare alcuni con h e alcuni senza. <% = h (""%> –

+0

Ora sarebbe stupido. Non mi interessa molto se viene sfuggito o no. Sto solo notando che non è richiesto dalle specifiche html. – kch

13

È possibile utilizzare sia h() o html_escape(), ma la maggior parte delle persone usano h() per convenzione. h() è l'abbreviazione di html_escape() in binari.

nel controller:

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

Secondo lei:

<%=h @stuff %> 

Se si visualizza l'origine HTML: si vedrà l'uscita senza in realtà grassetto i dati. Cioè è codificato come &lt;b&gt;Hello World!&lt;/b&gt;.

apparirà un essere visualizzato come <b>Hello World!</b>

121

Checkout classe Rubino CGI. Esistono metodi per codificare e decodificare HTML e URL.

CGI::escapeHTML('Usage: foo "bar" <baz>') 
# => "Usage: foo &quot;bar&quot; &lt;baz&gt;" 
+9

Grazie, questo è fantastico visto che può essere eseguito dai controller. Non che lo farei, ovviamente. –

+2

Questo è utile nei test di funzionalità/integrazione, per verificare la correttezza del contenuto inserito in un modello (quando la c ontent dovrebbe essere in formato HTML-escape). –

+0

Se il contenuto viene visualizzato in un sito Web dei clienti, diverso dal proprio (in cui non è possibile controllare la vista), qual è il problema con l'escaping dell'html prima di inserirlo nel database? C'è un altro lavoro in giro? – n00b

70

In Ruby on Rails 3 HTML verrà salvato per impostazione predefinita.

Per le stringhe non sfuggito usare:

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

funziona come un incantesimo. Grazie. –

+0

esattamente quello che stavo cercando, grazie. – GnrlBzik

0

h() è utile anche per sfuggire citazioni.

Ad esempio, ho una vista che genera un collegamento utilizzando un campo di testo result[r].thtitle. Il testo potrebbe includere virgolette singole. Se io non sfuggì result[r].thtitle nel metodo di conferma, il Javascript romperebbe:

&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> 

Nota: la dichiarazione :html titolo è magicamente sfuggito dalle rotaie.

13

Un'aggiunta alla risposta di Christopher Bradford a utilizzare il codice HTML fuggire da nessuna parte, poiché la maggior parte delle persone non usano CGI al giorno d'oggi, è anche possibile utilizzare Rack:

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

Funziona con gamberi. Grazie. – zezim

+0

Esiste un modo migliore per evitare le stringhe in modo simile nei metodi di istanza del modello? –

22

ERB::Util.html_escape può essere utilizzato ovunque. È disponibile senza utilizzare require in Rails.

+0

questo in realtà sta usando 'CGI.escapeHTML' sotto – akostadinov

+0

@akostadinov - il risultato è comunque diverso. Ad esempio, ERB :: Util.html_escape trasformerà gli apostrofi in ' mentre CGI :: escapeHTML non sarà –

+0

@LouisSayers, non riesco a vedere come ciò può accadere: '' ' [43] leva (principale)> mostra- fonte ERB :: Util.html_escape Da: /usr/share/ruby/erb.rb @ linea 945: proprietario: # Visibilità: pubblico Numero di rami: 3 DEF html_escape (s) CGI.escapeHTML (s.to_s) fine '' ' – akostadinov

2

Comparaison dei diversi metodi:

> 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;" 

ho scritto la mia per essere compatibile con Rails ActiveMailer fuga:

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