Подтвердить что ты не робот

Почему междоменный JSONP безопасен, но междоменный JSON нет?

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

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

Почему это нормально, чтобы получать междоменные данные, если они поступают через JSONP, но не если они поступают через JSON?

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

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

4b9b3361

Ответ 1

Я не знаю, как выглядело ощущение, что JSONP безопасно, но посмотрите

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

и

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

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

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

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

Ответ 2

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

Обычный ol 'AJAX

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

Решение. Не используйте XHR

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

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

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

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

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

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

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

Используется с умом, JSONP является довольно удивительным, хотя.