2012-09-25 19 views
25

Estoy construyendo una aplicación Backbone.js y me pregunto cuál es la mejor manera de tratar con XSS respectivamente el escape de HTML cuando se usa Backbone.js.Backbone.js y XSS/HTML escapándose

En el documento básico Todos example application de la documentación oficial de Backbone.js, no se escaparon los datos. Dado que estos datos se utilizan en la plantilla para hacer que las entradas de tareas pendientes, es posible ejecutar código Javascript introduciendo el siguiente texto (pueden ser reproducidos en el siguiente enlace):

"><script>alert('xss');</script> 

Cuando se utiliza un servidor REST como back-end de almacenamiento, este XSS es persistente para cada usuario.

¿Cómo resuelves este problema?

Mi idea es escapar de los datos en el servidor, por lo que los datos devueltos luego son seguros para ser utilizados en una plantilla. ¿Debo utilizar siempre wait: true para asegurarme de que no se procesen datos sin protección? Y para editar, agregue otro atributo con los datos no guardados, que luego se pueden usar para rellenar el campo de texto usando .val()?

¿O no hace nada de esto y escapa de los datos en el cliente, antes de representar la plantilla?

+2

¿Qué pasa con la función de escape para los modelos? http://backbonejs.org/#Model-escape – eveevans

+1

Parece que el ejemplo ya se ha corregido. –

Respuesta

48

El ejemplo de Todo no es el ejemplo más limpio. Utiliza underscore's template engine, de la siguiente manera:

<input class="edit" type="text" value="<%= title %>" /> 

Para salir correctamente el HTML, utilice <%- en lugar de <%=:

<input class="edit" type="text" value="<%- title %>" /> 
2

La forma estándar en la columna vertebral es utilizar model.escape(attribute).

A partir de los documentos de la columna vertebral backbonejs.org/#Model-escape:

"Similar a conseguir, pero devuelve la versión HTML escapado de atributo de un modelo Si va a interpolar datos del modelo en HTML, utilizando escape para recuperar los atributos impedirá. Ataques XSS ".

var hacker = new Backbone.Model({ 
    name: "<script>alert('xss')</script>" 
}); 

alert(hacker.escape('name'));