JSONP: сценарии для междоменных запросов данных

Браузеры и веб-приложения имеют множество функций и механизмов для защиты пользователей и их данных от кибер-атак. Одним из них является политика одинакового происхождения (same-origin policy, сокращенно SOP), введенная бывшей корпорацией Netscape в 1996 году после внедрения JavaScript. Эта директива запрещает клиентским языкам сценариев, таким как JavaScript и ActionScript, а также языкам таблиц стилей, таким как CSS, обращаться к объектам (графике, видео и т.д.), происходящим с другого сайта или URL.

Примечание .

Происхождение определяется в URL как комбинация протокола (например, HTTP или HTTPS), домена и порта. СОР считается выполненным, только если все три элемента идентичны, так что межсайтовый доступ к сценариям возможен. Исключением являются поддомены, которые могут получать доступ к объектам доменов более высокого уровня через соответствующие свойства DOM.

Однако границы, установленные политикой same-origin, подходят не для всех типов веб-проектов, а в некоторых случаях могут даже мешать — например, в веб-приложениях, которые полагаются на асинхронную передачу данных между браузером и сервером (например, на основе Ajax). Для таких проектов необходимы решения для обхода директивы, например, метод JSON JSONP. Более подробно об этом рассказывается в следующих разделах.

Что такое JSONP?

JSONP (также пишется как JSON-P) — это метод, который помогает пересылать структурированные данные между различными доменами в формате JSON. Аббревиатура расшифровывается как JSON (JavaScript Object Notation) with Padding. Чтобы обойти политику same-origin при запросе файлов из других доменов, JSONP использует не объект «XMLHttpRequest», как это делает обычный код JSON, а элемент «script», включающий вызов функции. В отличие от других файлов, скрипты могут передаваться между доменами без нарушения SOP.

JSONP был разработан в 2005 году разработчиком программного обеспечения Бобом Ипполито и в последние годы был интегрирован во многие фреймворки Web 2.0, такие как Dojo Toolkit, jQuery или Google Web Toolkit, как жизнеспособная альтернатива привычному JSON.

Примечание

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

Как работает JSONP?

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

Примечание

Формат и название параметров, указываемых в строке запроса для инициирования JSONP-запроса, не стандартизованы. Поэтому в разных веб-приложениях они могут отличаться.

Следующий пример предназначен для пояснения работы JSONP:

<script type="text/javascript" < codesnippet></script>
src="http://not-origin-url.com/getjson?jsonp=exampleCallback">

Если этот простой JSONP-скрипт встроить в HTML-код веб-сайта, а затем запустить на любом клиенте, то доступ к JSON-данным будет осуществляться через иностранный домен «not-origin-url.com» («getjson»). Строка запроса «?jsonp=exampleCallback» сообщает обратившемуся серверу, что это JSONP-запрос. Кроме того, передается информация о том, что он должен отправить запрошенные данные в качестве параметра JavaScript-функции «exampleCallback».

Затем сервер генерирует соответствующий код JavaScript, включая запрашиваемую информацию в качестве параметра — в данном примере это пара имя-значение — и возвращает его клиенту:

exampleCallback( {"name":"test", "value":1} );

Затем вызов функции выполняется браузером, как если бы он был указан непосредственно в HTML-коде исходной страницы. Таким образом, браузер может обрабатывать данные, полученные из стороннего URL.

Примечание

Для каждого JSONP-запроса требуется один элемент <script>. В качестве альтернативы можно добавить новый элемент на стороне клиента (так называемая инъекция элемента сценария) или повторно использовать существующий элемент.

В следующем учебном пособии на YouTube представлена более подробная демонстрация метода JSONP:

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

Насколько безопасен JSONP?

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

Другие известные модели атак, использующие метод JSONP, следующие:

  • RFD (Reflected File Download): JSONP подвержен атакам RFD, когда пользователи клиента только кажутся загружающими данные из желаемого целевого домена. Однако на самом деле загружаются вредоносные файлы или URL-адреса, что в большинстве случаев происходит из-за манипуляций с функциями обратного вызова.
  • CSRF/XSRF (подделка межсайтовых запросов: Как

Оцените статью
cdelat.ru
Добавить комментарий