Что вызывает ответ Ajax, например: for (;;); {json data} ‘означает?

Возможный дубликат:
Почему люди ставят код как «throw 1; “и” for (;;); “перед ответами json?

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

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

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

Отклик:

 for (;;);{"t":"continue"} 

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

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

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

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

  1. непонимание JSONP или
  2. недоразумение «захват JSON».

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

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

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

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

 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(;;); появляется в этом конкретном fragmentе.

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

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

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

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

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

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

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

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

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

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

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

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

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

  

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

Как и было обещано, ссылка на газету .

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

  

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

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

  • Передайте пользовательский объект в ASP.NET Webmethod из jQuery, используя JSON
  • Импорт JSON в проект Eclipse
  • Как декодировать поле полилиний API Google Directions в длинные точки lat в объективе C для iPhone?
  • JQuery Ajax Проводка json для webservice
  • Разбор json в java-объекты в spring-mvc
  • Как разбирать вложенный объект JSON в Delphi XE2?
  • Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson
  • Как установить значение null в org.json.JSONObject в java?
  • Как запросить json-столбец для пустых объектов?
  • Gson превращает массив объектов данных в json - Android
  • JSON на IE6 (IE7)
  • Давайте будем гением компьютера.