Вопрос: Почему Google добавляет пока (1); к их ответам JSON?


Почему Google добавляет while(1);к их (частным) ответам JSON?

Например, вот ответ, когда вы включаете и выключаете календарь Календарь Google :

while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
  ['remindOnRespondedEventsOnly','true'],
  ['hideInvitations_remindOnRespondedEventsOnly','false_true'],
  ['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]

Я бы предположил, что это не позволяет людям делать eval()на нем, но все, что вам действительно нужно сделать, это заменить whileи тогда вы будете установлены. Я бы предположил, что предотвращение eval состоит в том, чтобы убедиться, что люди пишут безопасный JSON-код синтаксического анализа.

Я видел, что это использовалось и в нескольких других местах, но гораздо больше - с Google (Mail, Calendar, Contacts и т. Д.). Странно, Гугл документы начинается с &&&START&&&вместо этого, и Google Contacts, похоже, начинается с while(1); &&&START&&&,

Что тут происходит?


3445


источник


Ответы:


Это предотвращает Угон JSON ,

Продуманный пример: скажем, у Google есть URL-адрес, например mail.google.com/json?action=inboxкоторый возвращает первые 50 сообщений вашего почтового ящика в формате JSON. Злые сайты в других доменах не могут делать запросы AJAX для получения этих данных из-за политики одного и того же происхождения, но они могут включать URL-адрес через <script>тег. URL-адрес посещают ваш куки, а также переопределение глобального конструктора массива или методов доступа они могут иметь метод, называемый всякий раз, когда задан атрибут object (array или hash), позволяющий им читать содержимое JSON.

while(1);или &&&BLAH&&&предотвращает это: запрос AJAX на mail.google.comбудет иметь полный доступ к текстовому контенту и может удалить его. Но <script>Вставка тега вслепую выполняет JavaScript без какой-либо обработки, что приводит к бесконечному циклу или синтаксической ошибке.

Это не затрагивает проблему кросс-сайт-подлог ,


3731



Это предотвращает раскрытие ответа через захват JSON.

Теоретически содержание HTTP-ответов защищено Политикой одного и того же происхождения: страницы из одного домена не могут получать информацию со страниц в другом домене (если это явно не разрешено).

Злоумышленник может запрашивать страницы в других доменах от вашего имени, например. используя <script src=...>или <img>, но он не может получить никакой информации о результате (заголовки, содержимое).

Таким образом, если вы посетили страницу злоумышленника, он не смог прочитать ваше письмо с gmail.com.

За исключением того, что при использовании тега script для запроса содержимого JSON JSON выполняется как Javascript в контролируемой среде злоумышленника. Если злоумышленник может заменить конструктор Array или Object или какой-либо другой метод, используемый во время построения объекта, все, что в 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.


433



Это делается для того, чтобы какой-либо другой сайт не смог сделать неприятные трюки, чтобы попытаться украсть ваши данные. Например, заменяя конструктор массива , затем включив этот URL JSON через <script>тег, вредоносный сторонний сайт может украсть данные из ответа JSON. Поместив while(1);в начале скрипт вместо этого будет висеть.

С другой стороны, запрос на один и тот же сайт, использующий XHR и отдельный анализатор JSON, может легко игнорировать while(1);префикс.


340



Это должно было затруднить для третьей стороны вставить ответ JSON в документ HTML с помощью <script>тег. Помните, что <script>тег освобождается от Одинаковая политика происхождения ,


94



Это предотвращает его использование в качестве цели простого <script>тег. (Ну, это не мешает, но это делает его неприятным.) Таким образом, плохие парни не могут просто поместить этот тег сценария на свой собственный сайт и полагаться на активный сеанс, чтобы можно было получить ваш контент.

редактировать - обратите внимание на комментарий (и другие ответы). Проблема связана с разрушенными встроенными средствами, в частности Objectа также ArrayКонструкторы. Они могут быть изменены таким образом, чтобы в противном случае безобидный JSON при анализе мог вызвать код злоумышленника.


63



Since the <script> tag is exempted from the Same Origin Policy which is a security necessity in the web world, while(1) when added to the JSON response prevents misuse of it in the <script> tag.


2



It is to block the execution of JSON responses by clients that download that response. If you eval the JSON, your code will go into an infinite loop.

if Google didn’t do this, then for some user content, you might be able to put malicious code in the JSON data that gets executed when the JSON block is executed. If you read the JSON block with a parser, the while(1) loop is ignored.


0