Я пытаюсь понять, почему 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' соответствует текущему началу, но не его поддоменам
Смотрите здесь для поддерживаемых браузеров.