Понимание AJAX CORS и соображений безопасности
Я пытаюсь понять, почему CORS работает так, как работает.
Как я узнал из этого поста, когда страница с www.a.com отправляет запрос AJAX на www.b.com, тогда именно www.b.com решает, следует ли разрешить запрос или нет.
Но что именно закреплено на клиенте в такой модели? Например, если хакеру удается внедрить скрипт XSS в мою страницу, он отправляет AJAX-запрос в свой домен для хранения пользовательских данных. Так что домен хакера позволит такой запрос наверняка.
Я думал, что www.a.com должен решить, к каким доменам разрешить запрос. Так что теоретически в заголовке Access-Control-Allow-Origin я хотел бы поместить весь список доменов, которые разрешены для запросов AJAX CORS.
Может кто-нибудь объяснить, с какими проблемами безопасности сталкивается текущая реализация CORS?
2 ответа
Как я узнал из этого поста, когда страница из
www.a.com
делает AJAX запросwww.b.com
тогда этоwww.b.com
который решает, должен ли запрос быть разрешен или нет.
Не совсем. Запрос не заблокирован.
По умолчанию JavaScript работает на www.a.com
запрещен доступ к ответу от www.b.com
,
CORS позволяет www.b.com
дать разрешение на JavaScript от www.a.com
чтобы получить доступ к ответу.
Но что именно закреплено на клиенте в такой модели?
Это останавливает автора www.a.com
от чтения данных из www.b.com
используя браузер пользователя, который посетил оба сайта и прошел аутентификацию www.b.com
(и, следовательно, имеет доступ к данным, которые не являются общедоступными).
Например, Алиса вошла в Google. Алиса посещает malicious.example
который использует XMLHttpRequest для доступа к данным из gmail.com
, У Алисы есть учетная запись GMail, поэтому в ответе содержится список самых последних сообщений электронной почты. Такая же политика происхождения мешает malicious.example
читать это
Например, если хакер успешно внедрит скрипт XSS в мою страницу, он отправит AJAX-запрос в свой домен для сохранения пользовательских данных. Так что хакеры домена разрешат такой запрос наверняка.
Правильный. XSS - это другая проблема безопасности, которую нужно решать в источнике (т.е. в www.a.com
а не в браузере).
В дополнение к отличному ответу @Quentin, есть еще одна технология, известная как Content Security Policy, которая описывает, что вы ищете.
Я думал, что www.a.com должен решить, к каким доменам разрешить запрос. Так что теоретически в заголовке Access-Control-Allow-Origin я хотел бы поместить весь список доменов, которые разрешены для запросов AJAX CORS.
С помощью CSP вы можете установить заголовок с вашего домена (www.a.com
в вашем примере) для ограничения AJAX-запросов:
connect-src ограничивает источники, к которым вы можете подключиться (через XHR, WebSockets и EventSource).
Таким образом, чтобы использовать это, вы можете добавить это Content-Security-Policy
HTTP-заголовок вашего HTML-ответа:
Content-Security-Policy: connect-src 'self'
Это ограничит запросы AJAX www.a.com
если этот заголовок находится в ответе от www.a.com
:
'self' соответствует текущему источнику, но не его поддоменам
Смотрите здесь для поддерживаемых браузеров.