Содержание статьи
- Same Origin Policy
- Cross-Origin Resource Sharing (CORS)
- Access-Control-Allow-Origin
- Access-Control-Allow-Credentials
- Простые и сложные запросы
- Запросы pre-flight
- Частые ошибки конфигурации CORS
- Отражение Origin в ответном заголовке
- Значение null в белом списке
- Ошибки парсинга заголовка Origin
- В поисках мисконфигов
- Тестирование
- Результаты
- Выводы
Same Origin Policy
SOP (Same Origin Policy) — это политика безопасности браузера, контролирующая взаимодействие между сайтами. Она нужна для предотвращения кражи данных пользователя вредоносным скриптом.
До внедрения SOP данные крали так:
- Атакующий заставляет жертву перейти на вредоносный сайт с уже подготовленным эксплоитом на JavaScript.
- Жертва перешла по ссылке, и от ее имени отправляется запрос на сайт, содержащий ее важные данные.
- Ответ от сайта читается скриптом и передается на сервер злоумышленника.
- Злоумышленник получает личные данные, которые может использовать для развития атаки.
Проблема в том, что, когда браузер отправляет HTTP-запрос из одного источника в другой, cookie-файлы, относящиеся к другому домену, тоже отправляются в запросе. Это значит, что ответ будет сгенерирован в рамках сеанса пользователя и будет включать в себя доступные только ему данные. Чтобы предотвратить такое поведение, и существует SOP.
Межсайтовые взаимодействия обычно делят на три категории:
- Межсайтовые записи. Как правило, допускаются. Это могут быть ссылки, редиректы, формы, отправка запросов через fetch и так далее. Некоторые «сложные» запросы требуют pre-flight (предварительного запроса), но об этом поговорим отдельно.
-
Межсайтовое встраивание. Обычно разрешено. Например, для подгрузки ресурсов через теги
img
,video
,frame
и аналогичные им. - Межсайтовое чтение. Как правило, не допускается, но доступ к чтению часто просачивается путем встраивания. Например, ты можешь прочитать ширину и высоту встроенного изображения, получить результат действия встроенного сценария или проверить доступность встроенного ресурса.
В качестве иллюстрации отправим несколько запросов со страницы http://
. Реакция SOP приведена в таблице ниже.
А вот схема, показывающая, из чего состоит заголовок Origin
.
Cross-Origin Resource Sharing (CORS)
Раньше сайтам требовалось взаимодействовать друг с другом, но SOP блокировала множество таких запросов. Тогда люди придумали механизм CORS (Cross-Origin Resource Sharing), который предназначался для смягчения политики SOP.
Вот чуть более подробное описание из справки Mozilla:
«Cross-Origin Resource Sharing — механизм, использующий дополнительные HTTP-заголовки, чтобы дать возможность агенту пользователя получать разрешения на доступ к выбранным ресурсам с сервера на источнике (домене), отличном от того, что сайт использует в данный момент. Говорят, что агент пользователя делает запрос с другого источника (cross-origin HTTP request), если источник текущего документа отличается от запрашиваемого ресурса доменом, протоколом или портом».
Теперь давай разберемся с двумя заголовками, на которые предстоит чаще всего обращать внимание: Access-Control-Allow-Origin
и Access-Control-Allow-Credentials
.
Access-Control-Allow-Origin
Заголовок ответа Access-Control-Allow-Origin
показывает, с какого источника может быть доступен ответ сервера.
Возможные значения:
- Звездочка — говорит браузерам разрешать запрос любого происхождения для доступа к ресурсу (но только для запросов без учетных данных).
-
<
— указывает одно происхождение, с которого можно получать ответ сервера.domain> -
null
— указывает «нулевое» происхождение. Никогда не добавляй его в белый список! Происхождение для некоторых схем (data:
,file:
) и документы, доступные через песочницу, определяются как «нулевые».
Access-Control-Allow-Credentials
В зависимости от заголовков межсайтовые запросы могут быть переданы без куки или заголовка авторизации. Впрочем, если задана настройка CORS Access-Control-Allow-Credentials:
, то сервер может разрешить чтение ответа, когда передаются куки или заголовок авторизации.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»