Понимание AJAX CORS и соображения безопасности

Я пытаюсь понять, почему CORS работает так, как работает.

Как я узнал из этот пост, когда страница с www.a.com делает запрос AJAX www.b.com, то это www.b.com, который решает, разрешить ли запрос или нет.

Но что именно защищено на клиенте в такой модели? Например, если хакеру удалось сделать инъекцию XSS script на мою страницу, тогда он делает запрос AJAX в своем домене для хранения пользовательских данных. Таким образом, домен хакера позволит такой запрос точно.

Я думал, что www.a.com должен решить, до каких доменов разрешить запрос. Поэтому теоретически в заголовке Access-Control-Allow-Origin я хотел бы поместить весь список доменов, разрешенных для запросов AJAX CORS.

Может кто-нибудь объяснить, какие проблемы безопасности выполняет текущая реализация CORS?

Ответ 1

Как я узнал из этого сообщения, когда страница из 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 script на мою страницу, затем он делает запрос AJAX в свой домен для хранения пользовательских данных. Таким образом, домен хакеров позволит обеспечить такой запрос.

Правильно. XSS - это другая проблема безопасности, которую необходимо устранить в источнике (т.е. В www.a.com, а не в браузере).

Ответ 2

В дополнение к @Quentin отличный ответ существует еще одна технология, известная как Политика безопасности контента, который описывает, что вы после.

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

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