Понимание 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' соответствует текущему источнику, но не его поддоменам

Смотрите здесь для поддерживаемых браузеров.

Другие вопросы по тегам