Estou usando o Backbone.js e o servidor da web Tornado. O comportamento padrão para receber dados de coleta no Backbone é enviar como uma matriz JSON.
Por outro lado, o comportamento padrão do Tornado é não permitir o JSON Array devido à seguinte vulnerabilidade:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Um relacionado é: http://haacked.com/archive/2009/06/06/25/json-hijacking.aspx
Parece mais natural para mim não ter que agrupar meu JSON em um objeto quando realmente é uma lista de objetos.
Não consegui reproduzir esses ataques em navegadores modernos (por exemplo, Chrome, Firefox, Safari e IE9 atuais). Ao mesmo tempo, não consegui confirmar em nenhum lugar que os navegadores modernos haviam resolvido esses problemas.
Para garantir que eu não seja enganado por possíveis habilidades de programação ruins ou habilidades de pesquisa no Google:
Esses ataques de seqüestro de JSON ainda são um problema hoje em navegadores modernos?
(Nota: desculpe pela possível duplicação para: É possível executar o 'sequestro de JSON' no navegador moderno? Mas como a resposta aceita não parece responder à pergunta - achei que estava na hora de perguntar novamente e obter algumas explicações mais claras .)
Respostas:
Não, ele não é mais possível é a de valores de captura passados para o
[]
ou{}
construtores em Firefox 21, Chrome 27 ou IE 10. Aqui está uma página de teste pequena, com base nos principais ataques descritos em http://www.thespanner.co.uk / 2011/05/30 / sequestro de json / :( http://jsfiddle.net/ph3Uv/2/ )
Ele substitui
window.Array
e adiciona um configurador eObject.prototype.foo
testa inicializando matrizes e objetos por meio dos formulários curto e longo.A especificação do ES4 , na seção 1.5, "exige que as ligações padrão globais de Object e Array sejam usadas para construir novos objetos para inicializadores de objeto e matriz" e observa no Precedent de implementação que "Internet Explorer 6, Opera 9.20 e Safari 3 fazem não respeite as religações locais ou globais de Object e Array, mas use os construtores Object and Array originais ". Isso é mantido no ES5, seção 11.1.4 .
Allen Wirfs-Brock explicou que o ES5 também especifica que a inicialização do objeto não deve acionar setters, pois usa DefineOwnProperty. MDN: Working with Objects observa que "A partir do JavaScript 1.8.1, os setters não são mais chamados ao definir propriedades nos inicializadores de objetos e matrizes". Isso foi abordado na edição 1015 da V8 .
fonte