Эта атака (загрузка JSON как <script>
) основана на нескольких предположениях:
1) JSON сам по себе является действительным JS (это то, что for(;;)
изменяется), что также означает, что он не может начинаться с {
, поскольку это оператор блока, который не содержит пар ключ-значение:
{ "a": 1 } // invalid JS, valid JSON *
[{ "a": 1 }] // valid JS, valid JSON
2) Браузер очень старый ( <1% от общего числа пользователей </a>), поскольку построение массивов с литералом не вызывает функцию Array
в новых браузерах (поддержка ES5 является хорошей оценкой для тех).
Следовательно, эта атака в данном случае невозможна, так как API, который вы упомянули, возвращает объект, поэтому (1) не полностью заполнен. И даже если API вернет массив, теоретически может быть взломано очень небольшое количество людей:
1) Браузер должен быть очень старым, и тогда сам браузер, вероятно, представляет больший риск, и браузер должен даже поддерживать JavaScript.
2) Клиент должен посетить вредоносный сайт, что маловероятно из-за спам-фильтров / черных списков на разных уровнях.
3) Пользователь должен войти на Facebook при посещении вредоносного веб-сайта.
Стоит отметить, что есть и другие ответы с бесконечным циклом
Полагаю, это в прошлом. Это займет некоторое время, пока все API не будут реорганизованы / перенесены. Я предполагаю, что добавление / удаление этих 5 символов приводит к значительным накладным расходам, если вы думаете в масштабе Facebook.
*: Если вы попытаетесь загрузить { a: 1 }
, вы обнаружите, что он не генерирует ошибку SyntaxError! Однако это не является действительным JSON и не создает объект (это помечено 1 внутри инструкции blocn).