Какой ответ json начинается с)]} '

Я заметил, что некоторые json-запросы, особенно в службах google, возвращают своеобразный "json", который начинается с закрывающей последовательности, а затем имеет только структуру массива, заданную квадратными скобками.

Что это за аякс? Есть ли какая-нибудь библиотека, js или py, разобрав ее?

Чтобы привести более конкретный пример:

>>> import json
>>> import urllib2
>>> url=urllib2.urlopen("https://plus.google.com/u/0/_/socialgraph/lookup/visible/?o=%5Bnull%2Cnull%2C%22114423404493486623226%22%5D")
>>> url.readline()
")]}'\n"
>>> url.readline()
'\n'
>>> url.readline()
'[["tsg.lac",[]\n'

и оттуда следует типичный массив. Таким образом, полный ответ представляет собой двухстрочный "заголовок", а затем массив, но "заголовок" очень озадачивает, и мне интересно, исходит ли оно из стандартной библиотеки ajax или это просто идея этих парней.

А, если вы используете инструменты разработчика Chrome для просмотра реальных запросов, вы видите то же самое. Поэтому я вынужден полагать, что это реальный ответ, а не артефакт запроса.

Ответ 1

Использование недопустимого JSON в начале сообщения - один из способов победить комбинацию CSRF и хитрой атаки на конструктор массива JavaScript.

Если этот URL вернул верный, развернутый массив, то любой посещенный вами сайт мог бы перегрузить функцию "Массив", поместить/вставить ссылку скрипта на этот URL Google+ на страницу и собрать ваши личные/защищенные данные, когда вы просто загрузили их страницу,

Собственный клиентский код Google может удалить этот недействительный JSON перед его синтаксическим анализом, поскольку он использует традиционный запрос XHR, который дает им доступ к необработанному ответу. Удаленный сайт может получить к нему доступ только посредством внедрения элемента скрипта и не имеет возможности предварительно обработать данные, прежде чем их проанализирует браузер. Последнее похоже на то, как работает JSONP: конструктор Array невольно становится функцией обратного вызова.

Подобный подход вы увидите на многих высококлассных сайтах, которые возвращают массивы JSON в ответ на запросы GET. Facebook дополняет их с for (;;); , например. Если вы попытаетесь использовать атаку CSRF на эти API-интерфейсы Facebook, браузер просто сделает бесконечный цикл на удаленном сайте, ссылаясь на частный API-интерфейс Facebook. На Facebook.com их клиентский код имеет возможность удалить его перед запуском JSON.parse().