2012-10-08 13 views
7

Estoy escribiendo una aplicación que usa Rails en el back-end y javascript/backbone en la interfaz. Estoy tratando de bootstrap some rails models into my javascript. Específicamente, me gustaría cargar el contenido de @courses en una variable js llamada window.courses. Tengo lo siguiente en un archivo html.erb.¿Cómo tratar las entidades HTML en Rails to_json output?

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

Estoy esperando la erb preprocesador para hacer esto en javascript válida, al igual que

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

... pero, en cambio, estoy recibiendo código que incluye HTML entities.

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

Obviamente, obtengo errores de javascript cuando trato de analizar esto.

¿Alguien sabe cómo puedo tratar con estas entidades de HTML para producir javascript válido? Me doy cuenta de que una opción sería unescape the entities on the client side, pero esto parece una solución indirecta. ¿Hay alguna manera de que logre que Rails produzca JSON que no necesita unescaping?

+2

Intenta usar '<% = raw (@ courses.to_json)%>' –

+0

Brillante, gracias! Pensé que debe haber una manera simple de hacer esto. –

+0

@dB '¿consideraría actualizar la respuesta aceptada? esto es muy inseguro y ha sido la fuente de muchas vulnerabilidades de scripts entre sitios. – oreoshake

Respuesta

9

Si se va a utilizar en bruto (obj.to_json) Debe asegurarse se establece el siguiente.

ActiveSupport.escape_html_entities_in_json = true 
5

La cuestión se resuelve por mi comentario, sólo para el registro:

rieles escapa cuerdas que se imprimen con <%= 'string' %>. Por esto, es guardar para mostrar los datos del usuario. Por lo tanto, si no desea que Rails escape la salida, debe indicarle a Rails explícitamente usando raw('string').

En su código, que sería: <%= raw(@courses.to_json) %>

+1

esto es básicamente pedir xss. trivialmente Lo he visto cientos de veces, por favor nunca lo uses crudo. – oreoshake

+0

Gracias por su comentario @oreoshake. ¿Puede indicarme una dirección a una alternativa? –

+0

En la respuesta anterior, menciono 'ActiveSupport.escape_html_entities_in_json = true'. Con esa configuración y los back-ends de json predeterminados, usar <= @ courses.to_json.html_safe%> está a salvo de xss. – oreoshake

Cuestiones relacionadas