Предотвращает раскрытие ответа через угон JSON.
Теоретически содержимое HTTP-ответов защищено той же политикой происхождения: страницы из одного домена не могут получать какие-либо фрагменты информации со страниц из другого домена (если это явно не разрешено).
Злоумышленник может запрашивать страницы в других доменах от вашего имени, например, используя тег <script src=...>
или <img>
, но он не может получить никакой информации о результате (заголовки, содержимое).
Таким образом, если вы посещаете страницу злоумышленника, он не может прочитать вашу электронную почту с gmail.com.
За исключением того, что при использовании тега сценария для запроса содержимого JSON JSON выполняется как Javascript в контролируемой среде злоумышленника. Если злоумышленник может заменить конструктор Array или Object или какой-либо другой метод, используемый во время конструирования объекта, все, что в 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"}
Таким образом, проверка того, что вы всегда возвращаете Object на верхнем уровне ответа, гарантирует, что JSON не является допустимым Javascript, хотя все еще является допустимым JSON.
Как отметил @hvd в комментариях, пустой объект {}
является допустимым Javascript, и знание того, что объект пуст, само по себе может быть ценной информацией.
Сравнение вышеуказанных методов
Способ OWASP менее навязчив, так как не требует изменений клиентской библиотеки и передает допустимый JSON. Однако неизвестно, могут ли прошлые или будущие ошибки браузера победить это. Как отмечает @oriadam, неясно, могут ли данные быть пропущены в результате ошибки синтаксического анализа при обработке ошибок или нет (например, window.onerror).
Google требует клиентскую библиотеку для поддержки автоматической десериализации и может считаться более безопасной в отношении ошибок браузера.
Оба метода требуют изменений на стороне сервера, чтобы разработчики не могли случайно отправить уязвимый JSON.