Pull to refresh

Зачем Google добавляет while(1); к своим JSON-ответам?

Reading time 2 min
Views 68K
Original author: Rjh
Это позволяет избежать CSRF/XSRF-атак (подделки межсайтовых запросов).

Рассмотрим следующий пример: допустим у Google есть URL вида gmail.com/json?action=inbox, который возвращает 50 первых сообщений вашего почтового ящика в формате JSON. Злоумышленник, чей сайт находятся на другом домене, не может выполнить AJAX запрос, обратившись по данному URL, чтобы получить данные, ввиду same origin policy (правило ограничения домена). Но ничто не мешает злоумышленнику включить вышеуказанный URL на свою страницу с помощью тега .

Данному URL будут переданы куки, сохранённые в вашем браузере для домена gmail.com. Путём переопределения глобального конструктора array или методов доступа злоумышленник может вызывать произвольный метод всякий раз, когда устанавливается атрибут объекта (массива или хэша), тем самым получая доступ к содержимому JSON.

Конструкция while(1); или &&&BLAH&&& позволяет этого избежать. Gmail.com при отправке AJAX-запросов имеет полный доступ к содержимому ответа и благополучно эту дополнительную конструкцию вырезает. Тег же выполняет JavaScript без какой-либо предварительной обработки, в результате чего, происходит либо бесконечный цикл (для while(1);) или синтаксическая ошибка (для &&&BLAH&&&).

[ Источник ]

UPD:
Информация от пользователя d00kie:

Это атака — JSON Hijacking, была блокирована в 2007/2008 производителями браузеров. Так что, в данном случае это «страховка» на случай, если изобретут новый способ перехвата и осталось «с тех времен», ибо хуже не будет. То, что в статье на столько старо, что с тех пор, как переопределяли Array() уже был «изобретён» новый способ (после фикса 2007 надо было найти новый способ и его нашли):

Object.prototype.__defineSetter__('Id', function(obj){alert(obj);});


И он тоже уже пофиксен в фаерфоксе версии >3.0.11…
Всё это история.
Tags:
Hubs:
+163
Comments 145
Comments Comments 145

Articles