Це запобігає розкриттю реакції через викрадення 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.