С какого ответа json начинается)]} ' - PullRequest
13 голосов
/ 04 июля 2011

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

Что это за Ajax? Есть ли какая-то библиотека, 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 Ответ

15 голосов
/ 04 июля 2011

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

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

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

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

...