Является ли CORS безопасным способом выполнения междоменных запросов AJAX? - PullRequest
74 голосов
/ 31 января 2011

После прочтения о CORS (Cross-Origin Resource Sharing) я не понимаю, как это повышает безопасность. Междоменная связь AJAX разрешена, если отправлен правильный заголовок ORIGIN. Как пример, если я отправлю

ПРОИСХОЖДЕНИЕ: http://example.com

Сервер проверяет, находится ли этот домен в белом списке и, если это так, заголовок:

Access-Control-Allow-Origin: [полученный URL здесь]

отправляется обратно вместе с ответом (это простой случай, есть и предварительно поданные запросы, но вопрос тот же).

Это действительно безопасно? Если кто-то хочет получить информацию, подделка заголовков ORIGIN кажется очень простой задачей. Также в стандарте говорится, что политика применяется в браузере, блокируя ответ, если Access-Control-Allow-Origin не верен. Очевидно, что если кто-то пытается получить эту информацию, он не будет использовать стандартный браузер, чтобы заблокировать ее.

Ответы [ 6 ]

142 голосов
/ 31 января 2011

Цель состоит в том, чтобы предотвратить это -

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

Идея состоит в том, что веб-сайту вашего банка нужен какой-то способ сообщить браузеру, следует ли доверять сценариям на веб-сайте X доступ к страницам в вашем банке.

54 голосов
/ 22 апреля 2015

Просто добавьте к ответу @jcoder весь смысл заголовка Origin, а не в том, чтобы защитить ресурсы, запрашиваемые на сервере, эта задача зависит от самого сервера другими способами, именно потому, что злоумышленникдействительно может подделать этот заголовок с помощью соответствующих инструментов.

Смысл заголовка Origin заключается в защите пользователя.Сценарий следующий:

  • злоумышленник создает вредоносный веб-сайт M

  • пользователь Алиса обманом подключается к M, который содержитСценарий, который пытается выполнить некоторые действия через CORS на сервере B, который на самом деле поддерживает CORS

  • B, вероятно, не будет иметь M в заголовке Access-Control-Allow-Origin, почему это так?

  • Основным моментом является то, что M не имеет возможности подделать или перезаписать заголовок Origin, поскольку запросы инициируются браузером Алисы.Поэтому ее браузер установит (правильный) Origin в значение M, которого нет в Access-Control-Allow-Origin в B, поэтому запрос не будет выполнен.

Теперь Алиса может изменитьЗаголовок Origin сам, но зачем ей, поскольку это будет означать, что она наносит вред себе?

TL; DR: Заголовок Origin защищает невинного пользователя.Это не защищает ресурсы.Он может быть подделан злоумышленником на своей собственной машине, но не может быть подделан на машине, не находящейся под его контролем.

Серверы все равно должны защищать свои ресурсы, так как соответствующий заголовок Origin не означает авторизованныйдоступ.Однако заголовок Origin, который НЕ совпадает, означает несанкционированный доступ.

47 голосов
/ 31 января 2011

Он не предназначен для того, чтобы люди не получали данные. Вы не можете разоблачить это без людей, получающих это.

Сконструировано так, что дано:

  • Алиса, человек, предоставляющий API, предназначенный для доступа через Ajax
  • Боб, человек с веб-браузером
  • Чарли, третье лицо, управляющее собственным сайтом

Если Боб заходит на сайт Чарли, то Чарли не может отправить JS в браузер Боба, чтобы он извлекал данные с сайта Алисы и отправлял их Чарли.

Вышеуказанная ситуация становится более важной, если у Боба есть учетная запись пользователя на веб-сайте Алисы, которая позволяет ему делать такие вещи, как оставлять комментарии или удалять данные - поскольку без защиты Чарли может сказать браузеру Боба сделать это за спиной Боба.

Если вы хотите, чтобы неавторизованные люди не видели данные, вам необходимо защитить их паролями, SSL-сертификатами клиента или некоторыми другими средствами аутентификации / авторизации на основе идентификации.

14 голосов
/ 31 января 2011

Цель той же политики происхождения не состоит в том, чтобы запретить людям доступ к контенту сайта в целом;если кто-то хочет это сделать, ему даже не нужен браузер.Смысл в том, чтобы остановить клиентские скрипты доступ к контенту в другом домене без необходимых прав доступа.См. Статью в Википедии для Одинаковая политика происхождения .

5 голосов
/ 19 января 2017

После прочтения о CORS я не понимаю, как это повышает безопасность.

CORS не повышает безопасность.CORS предоставляет механизмам, позволяющим серверам сообщать браузерам, как к ним должны обращаться внешние домены, и пытается сделать это таким образом, чтобы это соответствовало модели безопасности браузера, существовавшей до CORS (а именно Same Origin Policy * 1008).*).

Но Политика одного и того же происхождения и CORS имеют ограниченную область применения.В частности, спецификация CORS сама по себе не имеет механизма отклонения запросов.Он может использовать заголовки, чтобы указать браузеру не разрешать странице из чужого домена читать ответ.И, в случае предварительных запросов, он может попросить браузер не отправлять ему определенные запросы из чужого домена.Но CORS не указывает никаких средств, чтобы сервер отклонял (то есть не выполнял) фактический запрос.

Давайте рассмотрим пример.Пользователь зашел на сайт A через cookie.Пользователь загружает вредоносный сайт M, который пытается отправить форму с номерами от POST до A.Что случится?Хорошо, с или без CORS, а также с или без M в качестве разрешенного домена, браузер отправит запрос на A с файлом cookie авторизации пользователя, и сервер выполнит злонамеренный POST, как если бы пользователь инициировалit.

Эта атака называется Подделка межсайтовых запросов , и сам CORS не предпринимает никаких действий по ее смягчению.Вот почему защита CSRF так важна, если вы разрешаете запросы на изменение данных от имени пользователей.

Теперь использование заголовка Origin может быть важной частью вашей защиты CSRF.Действительно, проверка этого является частью текущей рекомендации по многоцелевой защите CSRF .Но это использование заголовка Origin выходит за пределы спецификации CORS.

В общем, CORS является полезной спецификацией для расширения существующей модели безопасности политики Same Origin Policy на другие принятые домены.Это не добавляет безопасности, и сайтам нужны те же механизмы защиты, что и до CORS.

1 голос
/ 04 мая 2017

Я опоздал с ответом, но я не думаю, что какой-либо пост здесь действительно дает искомый ответ. Самое главное, что браузер - это агент, который записывает значение заголовка origin. Злой скрипт не может записать значение заголовка origin. Когда сервер отвечает с заголовком Access-Control-Allow-Origin, браузер пытается убедиться, что этот заголовок содержит значение origin, отправленное ранее. Если нет, это вызывает ошибку и не возвращает значение обратно запрашивающему скрипту. Другие ответы на этот вопрос представляют собой хороший сценарий, когда вы хотели бы отказать в ответе на злой сценарий.

@ daniel f также дает хороший ответ на вопрос

...