2012-10-08 11 views
7

Sto scrivendo un'app che utilizza Rails sul backend e javascript/backbone sul frontend. Sto provando a bootstrap some rails models into my javascript. In particolare, vorrei caricare il contenuto di @courses in una variabile js denominata window.courses. Ho il seguente in un file html.erb.Come gestire le entità HTML nell'output di Rails to_json?

<%= javascript_tag do %> 
    window.courses = JSON.parse('<%= @courses.to_json %>'); 
<% end %> 

mi aspetto il preprocessore erb per rendere questo in javascript valido, in questo modo

<script type="text/javascript"> 
//<![CDATA[ 
    window.courses = JSON.parse('[{"code":"myCourseCode", ... 
//]]> 
</script> 

... ma, invece, mi sto codice che include HTML entities.

<script type="text/javascript"> 
//<![CDATA[ 
    window.courses = JSON.parse('[{&quot;code&quot;:&quot;myCourseCode&quot;, ... 
//]]> 
</script> 

Ovviamente, ottengo errori JavaScript quando provo ad analizzare questo.

Qualcuno sa come posso gestire queste entità HTML per produrre javascript valido? Mi rendo conto che un'opzione sarebbe a unescape the entities on the client side, ma questa sembra una soluzione rotonda. C'è un modo per far sì che Rails produca JSON senza necessità di escape?

+2

Provare a utilizzare '<% = raw (@ courses.to_json)%>' –

+0

Brillante, grazie! Ho pensato che ci deve essere un modo semplice per farlo. –

+0

@dB 'considera l'aggiornamento della risposta accettata? questo è molto pericoloso ed è stato la fonte di molte vulnerabilità di scripting cross-site. – oreoshake

risposta

9

Se avete intenzione di utilizzare prima (obj.to_json) è necessario verificare quanto segue è impostato.

ActiveSupport.escape_html_entities_in_json = true 
5

La domanda è risolto con il mio commento, solo per la cronaca:

Rails sfugge stringhe che vengono stampati utilizzando <%= 'string' %>. In questo modo, è possibile salvare i dati dell'utente. Quindi, se non si desidera che Rails sfugga all'output, è necessario comunicare esplicitamente a Rails utilizzando raw('string').

Nel codice, che sarebbe: <%= raw(@courses.to_json) %>

+1

questo fondamentalmente sta chiedendo xss. banalmente. L'ho visto centinaia di volte, per favore non usare mai crudo. – oreoshake

+0

Grazie per il tuo commento @oreoshake. Puoi indicarmi una direzione per un'alternativa? –

+0

Nella risposta sopra, cito 'ActiveSupport.escape_html_entities_in_json = true'. Con questa impostazione, e i backend predefiniti di json, usare <= @ courses.to_json.html_safe%> è al sicuro da xss. – oreoshake

Problemi correlati