Что Ajax вызывает как «for (;;)»? {json data} 'значит? [Дубликат]

178

Возможный дубликат:
Почему люди ставят код типа "throw 1; < dont be evil > " и для(;;);" перед ответами json?

Я нашел такой синтаксис, который используется в Facebook для вызовов Ajax. Я запутался в части for (;;); в начале ответа. Для чего он используется?

Это вызов и ответ:

GET http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0

Ответ:

for (;;);{"t":"continue"}
  • 0
    Интересный вопрос. Интересно, как они интерпретируют данные, хотя? Просто избавьтесь от for(;;); и проанализировать результат?
  • 0
    Я не собираюсь сливаться с дураками, потому что, хотя речь идет об одной и той же теме, ответы на этот вопрос не очень хорошо подойдут.
Показать ещё 1 комментарий
Теги:
facebook

5 ответов

103
Лучший ответ

У Facebook есть тонна разработчиков, работающих внутри на многих проектах, и для кого-то очень часто делается небольшая ошибка; будь то что-то столь же простое и серьезное, как отказ от данных, вставленных в шаблон HTML или SQL, или что-то такое сложное и тонкое, как использование eval (иногда неэффективное и, возможно, небезопасное) или JSON.parse (совместимое, но не универсальное расширение ) вместо "известного хорошего" JSON-декодера, важно выяснить способы легкого применения лучших практик для этой группы разработчиков.

Чтобы противостоять этой проблеме, Facebook в последнее время собирается "изо всех сил" с внутренними проектами, предназначенными для изящного применения этих лучших практик, и, честно говоря, единственным объяснением, которое действительно имеет смысл для этого конкретного случая, является то, что: кто-то внутренне решил что все JSON-анализы должны проходить через одну реализацию в своей основной библиотеке, и лучший способ обеспечить это, для каждого отдельного ответа API, чтобы получить for(;;); автоматически закрепленный на передней панели.

При этом разработчик не может быть "ленивым": они будут замечать немедленно, если они используют eval(), задаются вопросом, что происходит, а затем осознают свою ошибку и используют одобренный JSON API.

Другие предоставленные ответы, похоже, все относятся к одной из двух категорий:

  • непонимание JSONP или
  • непонимание "угона JSON".

Те, кто в первой категории, полагаются на идею, что злоумышленник может каким-то образом сделать запрос "с использованием JSONP" API, который его не поддерживает. JSONP - это протокол, который должен поддерживаться как на сервере, так и на клиенте: он требует, чтобы сервер возвращал нечто похожее на myFunction({"t":"continue"}), чтобы результат передавался локальной функции. Вы не можете просто "использовать JSONP" случайно.

Те, что во второй категории ссылаются на очень реальную уязвимость, которая была описана, позволяя подделку запросов на межсайтовый запрос через теги API, которые не используют, используют JSONP (например, этот), что позволяет форма "захвата JSON". Это делается путем изменения конструктора Array/Object, который позволяет получить доступ к информации, возвращаемой с сервера без функции обертки.

Однако это просто невозможно в этом случае: причина, по которой он вообще работает, заключается в том, что пустой массив (один из возможных результатов многих API-интерфейсов JSON, например, знаменитый пример Gmail) является допустимым выражением выражения, которое не является true для голого объекта.

Фактически, синтаксис объектов, определенных JSON (который включает в себя кавычки вокруг имен полей, как показано в этом примере), конфликтует с синтаксисом для блоков и поэтому не может использоваться на верхнем уровне script.

js> {"t":"continue"}
typein:2: SyntaxError: invalid label:
typein:2: {"t":"continue"}
typein:2: ....^

Чтобы этот пример можно было использовать с помощью переназначения конструктора Object(), для этого API должен был вместо этого возвращать объект внутри набора круглых скобок, что делает его действительным JavaScript (но тогда недействительным JSON).

js> ({"t":"continue"})
[object Object]

Теперь он может быть в том, что этот трюк префикса for(;;); отображается только "случайно" в этом примере и фактически возвращается другими внутренними API-интерфейсами Facebook, которые возвращают массивы; но в этом случае это должно быть действительно отмечено, так как тогда это будет "реальной" причиной того, почему for(;;); появляется в этом конкретном фрагменте.

  • 0
    Это должно быть помечено как правильный ответ. Для(;;);" Префикс, скорее всего, добавлен как побочный продукт исправления уязвимости переназначения конструктора Array.
  • 15
    Нет смысла, что for(;;); будет использоваться для запрета eval . У Facebook есть гораздо лучшие способы контролировать свой собственный код. И for(;;); разбивает все парсеры JSON, включая eval , одинаково. Разработчики должны удалить его вручную в любом случае, но это вряд ли мешает eval . Ответ - попытки угона JSON. Да, только литералы объектов недопустимы, но гораздо проще и менее подвержены ошибкам просто вставить (и позже удалить) for(;;) перед всем JSON, чем использовать условные операторы.
157

Я подозреваю, что основной причиной этого является контроль. Это заставляет вас извлекать данные через Ajax, а не через JSON-P или аналогичный (который использует теги script, и так потерпит неудачу, потому что цикл for бесконечен) и, таким образом, гарантирует, что Same Origin Policy. Это позволяет им контролировать, какие документы могут выдавать вызовы API — в частности, только документы, которые имеют тот же самый источник, что и этот вызов API, или те, которые Facebook специально предоставляет для доступа через CORS (в браузерах, поддерживающих CORS). Поэтому вы должны запросить данные через механизм, в котором браузер будет применять SOP, и вы должны знать об этом предисловии и удалять его перед десериализацией данных.

Итак, да, это о контроле (полезном) доступе к этим данным.

  • 1
    Спасибо за ответ TJ Crowder. Мне не ясно, нужно ли бороться с попытками десериализации, как это помогает в безопасности и какой тип атаки он предотвращает?
  • 9
    @mridkash: Единственное, о чем я могу думать, это то, что они не хотят, чтобы люди использовали этот API через JSON-P, который использует теги script для обхода Единой политики происхождения. Кроме того, они, очевидно, хотят получить результат, полученный только тем, кто знает о цикле for , поскольку, конечно, это нарушит любой стандартный JSON-декодер (и действительно, если декодер полагается на eval ). Так что этот API бесполезен, за исключением случаев, когда его извлекают через ajax и кто-то, кто знает, удаляет это предисловие. Возможно, он предназначен только для их клиентского кода, и они периодически меняют маркер ...
Показать ещё 13 комментариев
42

Ну, for(;;); - это бесконечный цикл (вы можете использовать консоль Chrome JavaScript для запуска этого кода на вкладке, если хотите, а затем посмотрите, как использование ЦП в диспетчере задач проходит через крышу, пока браузер не убьет вкладка).

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

Чтобы объяснить далее, довольно часто приходилось разбирать бит JSON-форматированных данных с помощью функции JavaScript eval(), делая что-то вроде:

var parsedJson = eval('(' + jsonString + ')');

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

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

  • 0
    Спасибо за ответ на аромат. Значит, это для безопасности? Тем не менее, мне неясно, какой хакер безопасности должен победить.
  • 0
    @mridkash - я добавил немного к ответу, надеюсь, это немного лучше для вас объясняет.
Показать ещё 8 комментариев
13

Я немного опоздал и T.J. в основном решил тайну, но я думал, что поделился бы замечательной статьей по этой теме, которая имеет хорошие примеры и дает более глубокое понимание этого механизма.

Эти бесконечные петли являются контрмерой против "Javascript hijacking", типа атаки, которая получила общественное внимание с атакой на Gmail, опубликованной Джеремией Гроссманом.

Идея такая же красивая, как и красивая: многие пользователи, как правило, постоянно регистрируются в Gmail или Facebook. Итак, что вы делаете, так это то, что вы создали сайт и на своем вредоносном сайте Javascript вы переопределяете конструктор объекта или массива:

function Object() {
    //Make an Ajax request to your malicious site exposing the object data
}

то вы включаете тег <script> на этом сайте, например

<script src="http://www.example.com/object.json"></script>

И, наконец, вы можете прочитать все о объектах JSON в ваших журналах вредоносного сервера.

Как и было обещано, ссылка на .

13

Это выглядит как взломать, чтобы предотвратить атаку CSRF. Существуют определенные для браузера способы подключения к созданию объектов, поэтому вредоносный веб-сайт может использовать это, а затем следующее:

<script src="http://0.131.channel.facebook.com/x/1476579705/51033089/false/p_1524926084=0" />

Если бы не существовал бесконечный цикл перед JSON, объект был бы создан, так как JSON может быть eval() ed как javascript, и крючки обнаружат его и обнюхивают членов объекта.

Теперь, если вы заходите на этот сайт из браузера, заходите в Facebook, он может получить ваши данные так, как если бы вы были, а затем отправить его обратно на свой собственный сервер, например, через AJAX или javascript.

  • 0
    Какие-нибудь примеры или ссылки о подключении к созданию объектов? Ничего не могу найти с помощью быстрого поиска Google.
  • 1
    @ dave1010 Возможность создания массива - известная проблема безопасности в большинстве браузеров. Однако с объектами такой проблемы не возникает. Вот почему распространенная техника защиты от CSRF при возврате массивов в JSON заключается в переносе массива в другой объект.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню