Безопасно ли использовать JSONP?

Есть ли какие-либо проблемы безопасности, которые следует учитывать при использовании JSONP?


person Community    schedule 05.03.2009    source источник
comment
сайт действительно безопасный ... я просто хочу знать, есть ли какие-либо проблемы с безопасностью с cookie, хранящимся на моем сервере.   -  person    schedule 05.03.2009
comment
Приведенная ниже ссылка от naugtur дает хорошее решение и подробное объяснение того, как его можно сломать и как оно работает. Пожалуйста, посмотрите.   -  person minghua    schedule 19.07.2013
comment
связанный вопрос для устранения проблем: Можно ли сделать безопасный запрос JSONP?   -  person Bergi    schedule 03.07.2014
comment
Проблема в том, что любые отправляемые данные отображаются как параметры запроса в запросе GET и, следовательно, могут быть зарегистрированы и т. Д.?   -  person WW.    schedule 13.05.2015


Ответы (4)


Обновление. JSONP - это распространенный способ взлома для выполнения междоменных запросов. Современные браузеры теперь имеют совместное использование ресурсов Cross Origin, а IE8 + имеет аналогичный XDomainRequest. См. http://enable-cors.org/ для получения дополнительной информации.

JSONP - это просто сценарий, который позволяет использовать обратный вызов. Однако вам следует знать о подделке межсайтовых запросов (CSRF).

Пока вы управляете сценарием и сервером, JSONP не более небезопасен, чем сценарий, включенный в него. Если у вас нет JSONP-сервиса, который возвращает конфиденциальные данные авторизованным пользователям. Вредоносный сайт может отправить запрос в службу (надеясь, что пользователь вошел в систему на вашем сайте) и получить данные. Сервис может проверить реферер запроса, но можно подделать реферер с помощью flash (спасибо Крису Москини).

Представьте себе этот сценарий: - Пользователь входит в свою учетную запись интернет-банка. Сохранение файла cookie сеанса в браузере пользователя. На этом сайте есть служба jsonp с конфиденциальной информацией о пользователе и его учетных записях. - Другие сайты не будут знать, что пользователь вошел в систему, но они могут сделать безумную догадку и попытаться получить доступ к службе jsonp. Поскольку у пользователя есть файл cookie сеанса, браузер получит ответ, и ничто не помешает сайту выполнить публикацию ajax для сохранения конфиденциальных данных на своем сервере.

Обновление от 28 июня 2012 г.. Если вы хотите защитить себя от CSRF-атак, прочитайте подробное сообщение в блоге эксперта по безопасности: http://erlend.oftedal.no/blog/?blogid=130

person gregers    schedule 05.03.2009
comment
В другом месте указывалось, что HTTP_REFERER можно подделать с помощью Flash, поэтому любые конфиденциальные данные, которые сервер предлагает через jsonp, уязвимы. - person Chris Moschini; 04.05.2012
comment
Это только одна сторона риска. Ссылка от naugtur показывает другую сторону риска и лучшее решение для этой части. - person minghua; 19.07.2013

Да, вам нужно быть осторожным, но при правильном использовании с доверенными службами это относительно безопасно.

Вот краткое изложение проблем безопасности с JSONP, насколько я понимаю:

С точки зрения потребителя:

  • Вы должны быть уверены, что провайдер не вернет вредоносный код JavaScript вместо ожидаемого JSON, заключенного в указанный вами обратный вызов JSONP.
  • То же самое можно сказать и о любых сторонних встроенных надстройках JavaScript, таких как Google Analytics.
  • Это похоже на XSS-атаки только в том смысле, что позволяет третьей стороне выполнять произвольный JavaScript в вашем приложении, однако вы должны сначала выбрать доверие этой третьей стороне, сделав запрос в первую очередь.

С точки зрения провайдера:

  • Вы не должны предполагать, что даже если клиентские файлы cookie присутствуют в запросе, потребитель является веб-страницей, находящейся под вашим контролем. Сравните заголовок Referer с белым списком авторизованных URL-адресов и / или не полагайтесь на аутентификацию на основе файлов cookie.
  • Аналогично атаке CSRF / сбитого с толку депутата.
person tlrobinson    schedule 08.09.2009

Есть проблемы с безопасностью для обеих сторон. Самый серьезный - для сайта, включающего JSONP.

Если вы включаете домен из другого (который вы не контролируете), этот домен может изменить скрипт в любое время. Они могут заставить javascript делать в контексте вашей веб-страницы все, что может делать ваш собственный javascript. Если вы используете JSONP, этого не избежать. Вы должны изучить междоменное общение с помощью iframe, что лучше всего сделать с помощью отличной библиотеки EasyDXM.

Если вы предлагаете веб-сервис, обрабатывающий JSONP, вам необходимо защитить себя от подделки межсайтовых запросов (CSRF). Здесь ваш веб-сервис возвращает конфиденциальную информацию зарегистрированным пользователям. Если пользователь вошел на ваш сайт, любой другой сайт может сгенерировать запрос GET к службе JSONP, и файлы cookie ВАШЕГО домена отправляются с запросом - по сути, аутентифицируя вошедшего в систему пользователя - за исключением того, что теперь удаленный домен получает ответ и может читать конфиденциальные данные!

Лучший способ защиты от CSRF - создать одноразовый номер (трудно угадываемое, случайно сгенерированное число) и сохранить его в сеансе. Выведите этот одноразовый номер во все формы на ВАШИХ веб-страницах и включите его во все запросы JSONP на ВАШИХ страницах. На сервере убедитесь, что одноразовый номер присутствует и исправен в запросе (будь то GET, POST и т. Д.). Другие домены не смогут угадать этот одноразовый номер и, следовательно, не смогут получить конфиденциальную информацию, несмотря на файлы cookie. послан.

Наконец, существует проблема безопасности другого типа: JSONP просто не поддерживает аутентификацию пользователя в браузере, которая возможна с помощью OAuth. Конечно, вы можете попросить сервер получить какой-то токен доступа (например, с OAuth) и использовать его. Однако, если вы хотите выполнить аутентификацию полностью в браузере, вам необходимо использовать междоменное взаимодействие с iFrames. Думаю, именно так это делает OAuth 2.0. Вот как вы это настраиваете: страницы, размещенные на вашем сайте, имеют полный доступ к вашему серверу. Имейте библиотеку javascript, которая загружает EasyDXM и использует ее для настройки скрытого iframe на вашем сайте, и разговаривайте с ним, используя это.

person Gregory Magarshak    schedule 27.03.2011

JSONP определенно небезопасен, поскольку он просто запускает все, что получает кросс-домен, как JavaScript.

решение! решение!

Создайте iframe, желательно изолированный, и загрузите туда JSONP. Получите результат и передайте его через window.postMessage

И да, как всегда, кому-то пришла в голову эта идея первым :)

Публикации в блоге больше нет, но я сохраняю ссылку здесь в качестве кредита: http://beebole.com/blog/general/sandbox-your-cross-domain-jsonp-to-improve-mashup-security/
изменить : ссылка на машину обратного пути

Он использовал хак window.name для связи iframe, но это было для IE6 и 7.

person naugtur    schedule 16.06.2011