Является ли CORS безопасным способом выполнения междоменных запросов AJAX?

StackOverflow https://stackoverflow.com/questions/4850702

Вопрос

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

ИСТОЧНИК: http://example.com

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

Доступ-Контроль-Разрешить-Происхождение:[получил URL здесь]

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

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

Это было полезно?

Решение

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

За пределами веб -браузера это не имеет значения. Он не предназначен для того, чтобы помешать людям получить данные, доступные для общественности. Вы не можете разоблачить это общественности, если бы представители общественности не получили его.

Он разработан таким образом, чтобы дать:

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

Алиса могла изменить Origin Сама заголовок, но зачем ей, так как это означало бы, что она наносит вред себе?

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

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

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

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

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

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

Давайте возьмем пример. Пользователь вошел на сайт A через печенье. Пользователь загружает вредоносный сайт M, который пытается представить форму, которая делает POST к A. Анкет Что случится? Ну, с или без COR, и с или без M Будучи разрешенным доменом, браузер отправит запрос на A с помощью авторизации пользователя, и сервер выполнит злонамеренный POST как будто пользователь инициировал это.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top