JSONP - JSONP

JSONP, или же JSON-P (JSON с заполнением), исторический JavaScript метод запроса данных путем загрузки <script> тег;[1] это теги, предназначенные для загрузки обычного JavaScript. Он был предложен Бобом Ипполито в 2005 году.[2] JSONP позволяет обмениваться данными в обход политика одного происхождения, который запрещает запускать код JavaScript для чтения мультимедиа ДОМ элементы или XMLHttpRequest данные, полученные за пределами исходного сайта страницы. Исходный сайт указывается комбинацией Схема URI, имя хоста и номер порта.

Он уязвим для источника данных, заменяющего безобидный вызов функции вредоносным кодом, поэтому был заменен на совместное использование ресурсов из разных источников (доступен с 2009 г.[3]) в современных приложениях.

Функциональность

HTML <script> element обычно разрешено выполнять код JavaScript, полученный из чужих источников. Услуги, отвечающие чистым JSON data, однако, не могли обмениваться данными из иностранных источников до принятия CORS (Совместное использование ресурсов из разных источников ).

Например, запрос в дипломатическую службу http://server.example.com/Users/1234 может вернуть запись для человека по имени Алиса в формате JSON. Синтаксис JSON соответствует синтаксису объекта JavaScript.

1 {2     "Имя": "Алиса",3     "Идентификатор": 1234,4     "Классифицировать": 75 }

Без поддержки CORS попытка использовать данные в разных доменах приводит к ошибке JavaScript.

1 <сценарий тип="приложение / javascript"2         src="http://server.example.com/Users/1234">3 </сценарий>

Браузер загрузит <script> файла, оценить его содержимое, неверно интерпретировать необработанные данные JSON как блок и вывести синтаксическую ошибку. Даже если данные интерпретировались как литералы объекта JavaScript, они не могли быть доступны для JavaScript, запущенного в браузере, поскольку без назначения переменной литералы объектов недоступны.

В шаблоне использования JSONP URL-запрос, на который указывает src атрибут в <script> Элемент возвращает данные JSON с обернутым вокруг него кодом JavaScript (обычно это вызов функции). Эти «упакованные полезные данные» затем интерпретируются браузером. Таким образом, функция, которая уже определена в среде JavaScript, может управлять данными JSON. Типичный запрос и ответ JSONP показаны ниже.

Вызов функции parseResponse () представляет собой «P» JSONP - «заполнение» или «префикс» вокруг чистого JSON.[4] Чтобы JSONP работал, сервер должен ответить ответом, который включает функцию JSONP. JSONP не работает с результатами в формате JSON. Вызов функции JSONP, который отправляется обратно, и полезная нагрузка, которую получает функция, должны быть согласованы между клиентом и сервером. По соглашению, сервер, предоставляющий данные JSON, предлагает запрашивающему веб-сайту назвать функцию JSONP, обычно используя имя jsonp или Перезвоните в качестве именованного параметра строки запроса в запросе к серверу: <script src="http://server.example.com/Users/1234?callback=parseResponse"></script>.

В этом примере полученная полезная нагрузка будет:

parseResponse({"Имя": "Алиса", "Идентификатор": 1234, "Классифицировать": 7});

Внедрение элемента скрипта

JSONP имеет смысл только при использовании с элементом скрипта. Для каждого нового запроса JSONP браузер должен добавлять новый <script> элемент или повторно использовать существующий. Первый вариант - добавление нового элемента скрипта - выполняется с помощью динамических манипуляций с DOM и известен как внедрение элемента скрипта. В <script> элемент внедряется в HTML DOM с URL-адресом желаемой конечной точки JSONP, установленным в качестве атрибута «src». Этот динамичный внедрение элемента скрипта обычно выполняется вспомогательной библиотекой JavaScript. jQuery и другие фреймворки имеют вспомогательные функции JSONP; есть также автономные варианты.

Пример использования jQuery для динамически вводить Элемент скрипта для вызова JSONP выглядит так:

$.getScript("http://server.example.com/Users/192.168.73.96?callback=parseResponse");

После внедрения элемента браузер оценивает элемент и выполняет HTTP-запрос GET для URL-адреса src, извлекая содержимое. Затем браузер оценивает возвращаемую полезную нагрузку как JavaScript. Обычно это вызов функции. Таким образом, использование JSONP может позволить страницам браузера обойти политика одного происхождения через внедрение элемента сценария.[нужна цитата ]

Сценарий выполняется в рамках включаемой страницы и, как таковой, по-прежнему подлежит междоменным ограничениям относительно домена включающей страницы. Это означает, что веб-страница не может, например, загрузить библиотеку, размещенную на другом сайте, через JSONP, а затем выполнять запросы XMLHttpRequest на этот сайт (если только совместное использование ресурсов из разных источников (CORS) поддерживается), хотя такую ​​библиотеку можно использовать для создания запросов XMLHttpRequests на своем собственном сайте.

Проблемы безопасности

Недоверенный сторонний код

Включение тегов сценариев с удаленных серверов позволяет удаленным серверам вводить любой контент на веб-сайт. Если на удаленных серверах есть уязвимости, которые позволяют внедрять JavaScript, страница, обслуживаемая с исходного сервера, подвергается повышенному риску. Если злоумышленник может внедрить любой JavaScript в исходную веб-страницу, то этот код может получить дополнительный JavaScript из любого домена, минуя политика одного происхождения.[5] Заголовок HTTP политики безопасности содержимого позволяет веб-сайтам сообщать веб-браузерам, какие сценарии домена могут быть включены.

Примерно в 2011 году была предпринята попытка определить более безопасное и строгое определение подмножества для JSONP.[1] что браузеры смогут выполнять запросы скриптов с определенным MIME типа "application / json-p". Если ответ не был проанализирован как строгий JSONP, браузер может выдать ошибку или просто проигнорировать весь ответ. Однако от этого подхода отказались в пользу CORS, и правильный тип MIME для JSONP остается приложение / javascript.[6]

Различия в пробелах

JSONP несет те же проблемы, что и разрешение JSON с помощью eval (): оба интерпретируют текст JSON как JavaScript, что означает отличия в обработке U + 2028 и U + 2029 от собственно JSON. Это делает некоторые строки JSON незаконными в JSONP; серверы, обслуживающие JSONP, должны перед передачей экранировать эти символы.[7]

Манипуляция именами обратного вызова и атака с отраженной загрузкой файлов

Необработанные имена обратного вызова могут использоваться для передачи вредоносных данных клиентам в обход ограничений, связанных с приложение / json Тип содержимого, как показано в атаке с использованием отраженной загрузки файлов (RFD) 2014 года.[8]

В небезопасные конечные точки JSONP также могут быть введены вредоносные данные.[9]

Подделка межсайтовых запросов

Наивные развертывания JSONP подлежат подделка межсайтового запроса (CSRF или XSRF) атаки.[10] Поскольку HTML <script> тег не уважает политика одного происхождения в реализациях веб-браузера вредоносная страница может запрашивать и получать данные JSON, принадлежащие другому сайту. Это позволит оценивать данные в формате JSON в контексте вредоносной страницы, возможно, раскрывая пароли или другие конфиденциальные данные, если пользователь в настоящее время вошел на другой сайт.

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

Розетта Флэш

Rosetta Flash - это метод эксплуатации, который позволяет злоумышленнику использовать серверы с уязвимой конечной точкой JSONP, вызывая Adobe Flash Player полагать, что указанный злоумышленником Flash-апплет был создан на уязвимом сервере. Flash Player реализует политика одного происхождения позволяя делать запросы (с помощью файлов cookie) и получать ответы от хостинга. Затем апплет может отправить полученные данные обратно злоумышленнику. Это эксплойт с перекрестным происхождением с воздействием, аналогичным внедрению произвольного Flash-апплета в уязвимый домен. Эксплойт использует полезную нагрузку ActionScript, скомпилированную в SWF-файл, полностью состоящий из буквенно-цифровых символов, путем создания zlib поток с определенным заголовком и ВЫПУСКАТЬ блоки с ad-hoc Кодирование Хаффмана. Полученный SWF-файл, состоящий только из букв и цифр, затем используется в качестве параметра обратного вызова для вызова JSONP. До июля 2014 года уязвимые сайты, такие как Google, YouTube, Twitter, Yahoo !, Яндекс, LinkedIn, eBay, Instagram и Tumblr, были уязвимы.[11] Эта уязвимость была обнаружена и опубликована инженером по безопасности Google Микеле Спаньоло.[12] и имеет CVE -2014-4671[13] и CVE-2014-5333.[14] Версия Adobe Flash Player 14.0.0.145, выпущенная 8 июля 2014 г., представила усиленную проверку файлов Flash,[15] а в версии 14.0.0.176, выпущенной 12 августа 2014 г., доработано исправление,[16] предотвращение работы этого эксплойта.

История

В июле 2005 года Джордж Джемпти предложил добавить к JSON необязательное присвоение переменной.[17][18] Первоначальное предложение для JSONP, где заполнение является функцией обратного вызова, похоже, было сделано Бобом Ипполито в декабре 2005 года.[19] и сейчас используется многими Веб 2.0 такие приложения, как Набор инструментов Dojo, Google Web Toolkit и Веб-сервисы.

Смотрите также

Рекомендации

  1. ^ а б «Более безопасный междоменный Ajax с JSON-P / JSONP». JSON-P.org. Архивировано из оригинал 4 марта 2016 г.. Получено 2011-10-30.
  2. ^ Ипполито, Боб (5 декабря 2005 г.). «Удаленный JSON - JSONP». Боб Ипполито о Haskell, Python, Erlang, JavaScript и т. Д.. Архивировано из оригинал на 2012-06-08. Получено 2017-02-10.
  3. ^ "Совместное использование ресурсов между источниками". Могу ли я использовать... Получено 4 мая 2020.
  4. ^ "Экспериментальный результат RDF установлен в переводчик JSON". Архивировано из оригинал 15 ноября 2014 г.. Получено 20 февраля, 2012.
  5. ^ Бен Хаяк (2014-10-17). «Выполнение метода того же происхождения» (PDF). Получено 2014-10-22.
  6. ^ Грей, Эли (27.06.2010). "Это безопасно для предоставления JSONP?". stackoverflow.com. Получено 2012-09-07.
  7. ^ «JSON: подмножество JavaScript, которого нет». Магнус Холм. Получено 16 мая 2011.
  8. ^ Орен Хафиф (2014). "Отраженная загрузка файла - новый вектор веб-атаки". TrustWave. Получено 2015-03-25.
  9. ^ «Практическая инъекция JSONP».
  10. ^ Гроссман, Иеремия (27 января 2006 г.). «Расширенные методы веб-атак с использованием GMail». Получено 3 июля, 2009.
  11. ^ Микеле, Спаньоло. «Злоупотребление JSONP с помощью Rosetta Flash». Архивировано из оригинал 21 июля 2014 г.. Получено 20 июля, 2014.
  12. ^ «Google - список уязвимостей программного обеспечения, обнаруженных или исправленных сотрудниками Google». Получено 29 июля, 2014.
  13. ^ «MITRE: CVE-2014-4671». Получено 29 июля, 2014.
  14. ^ «MITRE: CVE-2014-5333». Получено 21 августа, 2014.
  15. ^ «Бюллетень по безопасности Adobe APSB14-17». Получено 29 июля, 2014.
  16. ^ «Бюллетень по безопасности Adobe APSB14-18». Получено 21 августа, 2014.
  17. ^ "оценка JSON". 19 июля 2005 г. Архивировано с оригинал 12 февраля 2006 г.
  18. ^ "json: Сообщение: Re: Комментарии". 17 августа 2005 г.
  19. ^ «Удаленный JSON - JSONP». из __future__ импорт *. Bob.pythonmac.org. 5 декабря 2005 г. Архивировано с оригинал 4 декабря 2009 г.. Получено 8 сентября, 2008.

внешняя ссылка