Это предотвращает раскрытие ответа через захват JSON.
Теоретически содержимое HTTP-ответов защищено одной и той же политикой происхождения: страницы из одного домена не могут получать какую-либо информацию со страниц из другого домена (если это явно не разрешено).
Злоумышленник может запрашивать страницы в других доменах от вашего имени, например используя тег <script src=...>
или <img>
, но он не может получить никакой информации о результате (заголовки, содержимое).
Таким образом, если вы посетите страницу злоумышленника, он не сможет прочитать вашу электронную почту с gmail.com.
За исключением того, что при использовании тега сценария для запроса содержимого JSON JSON выполняется как JavaScript в контролируемой злоумышленником среде. Если злоумышленник может заменить конструктор массива или объекта или какой-либо другой метод, используемый во время создания объекта, все, что в JSON, пройдет через код злоумышленника и будет раскрыто.
Обратите внимание, что это происходит во время выполнения JSON как JavaScript, а не во время его анализа.
Есть несколько контрмер:
Убедитесь, что JSON никогда не выполняется
Помещая оператор while(1);
перед данными JSON, Google гарантирует, что данные JSON никогда не выполняются как JavaScript.
Только легитимная страница может получить весь контент, удалить while(1);
и проанализировать остаток как JSON.
Например, такие вещи, как for(;;);
, были замечены в Facebook с теми же результатами.
Убедитесь, что JSON недействителен JavaScript
Точно так же добавление недопустимых токенов перед JSON, например &&&START&&&
, гарантирует, что он никогда не будет выполнен.
Всегда возвращайте JSON с объектом снаружи
Это OWASP рекомендуемый способ защиты от взлома JSON менее опасный и менее опасный.
Подобно предыдущим контрмерам, он гарантирует, что JSON никогда не выполняется как JavaScript.
Допустимый объект JSON, если он ничем не заключен, недопустим в JavaScript:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Однако это действительный JSON:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Таким образом, если вы всегда возвращаете объект на верхнем уровне ответа, это гарантирует, что JSON не является допустимым JavaScript, но при этом остается действительным JSON.
Как отмечает @hvd в комментариях, пустой объект {}
является допустимым JavaScript, и знание того, что объект пустой, само по себе может быть ценной информацией.
Сравнение вышеперечисленных методов
Способ OWASP менее навязчив, поскольку не требует изменений клиентской библиотеки и передает действительный JSON. Однако неясно, смогут ли прошлые или будущие ошибки браузера победить это. Как отмечает @oriadam, неясно, могла ли утечка данных происходить в результате ошибки синтаксического анализа посредством обработки ошибок или нет (например, window.onerror).
Способ Google требует клиентской библиотеки для поддержки автоматической десериализации и может считаться более безопасным в отношении ошибок браузера.
Оба метода требуют изменений на стороне сервера, чтобы разработчики случайно не отправили уязвимый JSON.
person
Arnaud Le Blanc
schedule
02.02.2014
)]}'
вместоwhile(1);
? Были бы ответы такие же? - person Gizmo   schedule 16.02.2017)]}'
может также использоваться для сохранения байтов, например, в facebook используетсяfor(;;);
, который сохраняет один байт :) - person Gras Double   schedule 08.07.2017