Estoy usando Backbone.js y el servidor web Tornado. El comportamiento estándar para recibir datos de recopilación en Backbone es enviar como una matriz JSON.
Por otro lado, el comportamiento estándar de Tornado es no permitir JSON Array debido a la siguiente vulnerabilidad:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Una relacionada es: http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Me parece más natural no tener que envolver mi JSON en un objeto cuando realmente es una lista de objetos.
No pude reproducir estos ataques en los navegadores modernos (es decir, Chrome, Firefox, Safari e IE9 actuales). Al mismo tiempo, no pude confirmar en ningún lado que los navegadores modernos hubieran abordado estos problemas.
Para asegurarme de no confundirme con las posibles habilidades de programación deficientes ni con las habilidades de búsqueda de Google:
¿Estos ataques de secuestro JSON siguen siendo un problema hoy en día en los navegadores modernos?
(Nota: Lo siento por el posible duplicado a: ¿Es posible hacer 'JSON secuestro' en el navegador moderno? Pero ya no parece la respuesta aceptada para responder a la pregunta - pensé que era el momento de pedir de nuevo y obtener algunas explicaciones más claras .)
Respuestas:
No, ya no es posible con los valores de captura se pasan a la
[]
o{}
constructores en Firefox 21, Chrome 27, o IE 10. He aquí una pequeña página de prueba, sobre la base de los principales ataques descritos en http://www.thespanner.co.uk / 2011/05/30 / json-secuestro / :( http://jsfiddle.net/ph3Uv/2/ )
Anula
window.Array
y agrega un setterObject.prototype.foo
y prueba inicializando matrices y objetos a través de las formas cortas y largas.La especificación ES4 , en la sección 1.5, "requiere que se usen los enlaces globales y estándar de Object and Array para construir nuevos objetos para inicializadores de objetos y matrices" y notas en el precedente de implementación que "Internet Explorer 6, Opera 9.20 y Safari 3 hacen no respete los cambios locales o globales de Object y Array, sino que use los constructores originales Object y Array ". Esto se conserva en ES5, sección 11.1.4 .
Allen Wirfs-Brock explicó que ES5 también especifica que la inicialización de objetos no debe desencadenar establecedores, ya que utiliza DefineOwnProperty. MDN: Trabajar con objetos señala que "a partir de JavaScript 1.8.1, los configuradores ya no se llaman cuando se configuran propiedades en los inicializadores de objetos y matrices". Esto se abordó en V8 número 1015 .
fuente