Почему междоменный JSONP безопасен, а междоменный JSON - нет? - PullRequest
25 голосов
/ 18 августа 2011

У меня проблемы с подключением некоторых точек, недавно узнавших о JSONP.Вот мое понимание:

  • Междоменный XmlHttpRequests для любого контента (включая JSON) запрещен из-за той же политики происхождения.Это защищает от XSRF.
  • Вам разрешено иметь тег script с src, который возвращает JSONP - некоторые JSON дополняются внутри вызова функции Javascript (скажем, 'Foo')
  • иметь некоторую реализацию 'foo' на странице, которая будет вызываться при возврате данных JSONP, и вы можете делать что-то с данными JSON, когда функция передается

Почему нормально получать перекрестные данные-доменные данные, если они пришли через JSONP, но не если они пришли через JSON?

Есть ли предположение, что JSON склонен разрешать XSRF, а JSONP - нет?Если да, то есть ли какая-либо причина, кроме того, что JSONP является каким-то де-факто форматом данных, который никогда не предоставит данные, поддерживающие XSRF?Почему JSONP, а не какой-то произвольный корневой тег в XML вместо этого?

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

Ответы [ 2 ]

10 голосов
/ 29 мая 2014

Я понимаю, что этот вопрос о том, почему браузер считает JSONP безопасным, а не о том, безопасен ли он (а это не так).Я рассмотрю этот вопрос шаг за шагом.

Обычный AJAX

Для выполнения обычного запроса AJAX браузер создает XHR-объект , указывающий его на URLи тянет данные.Объект XHR будет доверять только данным из того же домена.Это жесткое ограничение.В текущих браузерах не обойти его (редактировать - теперь вы можете использовать CORS).

Решение - не использовать XHR

Поскольку XHR подчиняется одному и тому же домену poilicy, мы не можем использовать XHR для междоменного домена AJAX .К счастью, есть и другие способы поразить удаленный сервер.Мы могли бы добавить тег изображения к странице, например.Мы также можем добавить тег script и присвоить ему атрибут src, указывающий на удаленный сервер.Например, мы можем извлечь JQuery из CDN и ожидать, что он будет работать.

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

Когда мы делаем запрос JSONP, наш код динамически добавляет тег сценария кстраница .У тега script есть атрибут source, который указывает на удаленный URL-адрес JSONP API, как если бы вы вставляли скрипт из CDN.

Возвращаемый сервером JSONP-скрипт заключен в вызов функции .Когда скрипт загружен, функция будет выполнена автоматически.

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

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

Здесь есть довольно большие проблемы безопасности.Скрипт, который вы загружаете, может взять под контроль вашу страницу и подвергнуть ваших пользователей риску.JSONP небезопасен для ваших пользователей, он просто не блокируется веб-браузерами. JSONP - это браузер, которым мы пользуемся .Используйте с осторожностью.

При грамотном использовании JSONP довольно хорош.

7 голосов
/ 18 августа 2011

Я не знаю, как возникло ощущение, что JSONP безопасен, но вижу, что

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

и

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

обе цитаты из http://json -p.org / .

другие ссылки с полезной информацией о JSONP / security:

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

...