O JSON Hijacking ainda é um problema nos navegadores modernos?

Eu estou usando Backbone.js e o servidor 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/25/json-hijacking.aspx

Parece mais natural não ter que envolver meu JSON em um object quando realmente é uma lista de objects.

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 abordaram esses problemas.

Para garantir que não estou enganando nem por possíveis habilidades de programação nem por pobres habilidades de pesquisa:

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 fazer ‘JSON hijacking’ no navegador moderno? Mas desde que a resposta aceita não parece responder a pergunta – eu pensei que era hora de perguntar de novo e obter algumas explicações mais claras .)

Não, não é mais possível capturar valores passados ​​para os construtores [] ou {} no Firefox 21, no Chrome 27 ou no IE 10. Veja uma pequena página de teste, com base nos principais ataques descritos em http://www.thespanner .co.uk / 2011/05/30 / json-sequestro / :

( http://jsfiddle.net/ph3Uv/2/ )

 var capture = function() { var ta = document.querySelector('textarea') ta.innerHTML = ''; ta.appendChild(document.createTextNode("Captured: "+JSON.stringify(arguments))); return arguments; } var original = Array; var toggle = document.body.querySelector('input[type="checkbox"]'); var toggleCapture = function() { var isOn = toggle.checked; window.Array = isOn ? capture : original; if (isOn) { Object.defineProperty(Object.prototype, 'foo', {set: capture}); } else { delete Object.prototype.foo; } }; toggle.addEventListener('click', toggleCapture); toggleCapture(); [].forEach.call(document.body.querySelectorAll('input[type="button"]'), function(el) { el.addEventListener('click', function() { document.querySelector('textarea').innerHTML = 'Safe.'; eval(this.value); }); });