Я использую Backbone.js и веб-сервер Tornado. Стандартное поведение для получения данных коллекции в Backbone - отправка в виде массива JSON.
С другой стороны, стандартное поведение Tornado не допускает использование JSON Array из-за следующей уязвимости:
http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
Связанный является: http://haacked.com/archive/2009/06/25/json-hijacking.aspx
Для меня более естественно, что мне не нужно заключать JSON в объект, когда это действительно список объектов.
Мне не удалось воспроизвести эти атаки в современных браузерах (то есть в современных Chrome, Firefox, Safari и IE9). В то же время я нигде не смог подтвердить, что современные браузеры решили эти проблемы.
Чтобы убедиться, что меня не вводят в заблуждение ни какие-либо возможные плохие навыки программирования или плохие навыки поиска в Google:
Являются ли эти атаки JSON Hijacking все еще проблемой современных браузеров?
(Примечание: извините за возможный дубликат: возможно ли выполнить «захват JSON» в современном браузере? Но так как принятый ответ, похоже, не отвечает на вопрос - я подумал, что пришло время задать его снова и получить более четкие объяснения .)
Ответы:
Нет, больше невозможно получить значения, переданные конструкторам
[]
или{}
в Firefox 21, Chrome 27 или IE 10. Вот небольшая тестовая страница, основанная на основных атаках, описанных в http://www.thespanner.co.uk / 2011/05/30 / json-hijacking / :( http://jsfiddle.net/ph3Uv/2/ )
Он переопределяет
window.Array
и добавляет установщикObject.prototype.foo
и проверяет инициализацию массивов и объектов с помощью коротких и длинных форм.Спецификация ES4 , в разделе 1.5, «требует, чтобы глобальные стандартные привязки Object и Array использовались для создания новых объектов для инициализаторов объектов и массивов» и отмечает в Precedent реализации, что «Internet Explorer 6, Opera 9.20 и Safari 3 делают не уважать ни локальные, ни глобальные перепривязки Object и Array, но использовать оригинальные конструкторы Object и Array. " Это сохраняется в ES5, раздел 11.1.4 .
Аллен Уирфс-Брок объяснил, что ES5 также указывает, что инициализация объекта не должна вызывать сеттеры, поскольку она использует DefineOwnProperty. MDN: Работа с объектами отмечает, что «Начиная с JavaScript 1.8.1, сеттеры больше не вызываются при установке свойств в инициализаторах объектов и массивов». Это было решено в выпуске V8 1015 .
источник