Содержание статьи
- Same Origin Policy
- Cross-Origin Resource Sharing (CORS)
- Access-Control-Allow-Origin
- Access-Control-Allow-Credentials
- Простые и сложные запросы
- Запросы pre-flight
- Частые ошибки конфигурации CORS
- Отражение Origin в ответном заголовке
- Значение null в белом списке
- Ошибки парсинга заголовка Origin
- В поисках мисконфигов
- Тестирование
- Результаты
- Выводы
В этой статье мы расскажем, как работает технология SOP, которая защищает твой браузер от вредоносных скриптов. Разберем основные виды мисконфигов и составим шпаргалки с разными случаями поведения CORS. В конце разберем пример и проверим работоспособность PoC.
Same Origin Policy
SOP (Same Origin Policy) — это политика безопасности браузера, которая контролирует взаимодействие между сайтами. Она нужна для предотвращения кражи данных пользователя вредоносным скриптом.
До внедрения SOP, данные крали так:
Проблема в том, что когда браузер отправляет HTTP-запрос из одного источника в другой, cookie-файлы, относящиеся к другому домену, тоже отправляются в запросе. Это значит, что ответ будет сгенерирован в рамках сеанса пользователя и будет включать в себя доступные только ему данные. Чтобы предотвратить такое поведение и существует SOP.
Межсайтовые взаимодействия обычно делят на три категории:
В качестве иллюстрации отправим несколько запросов со страницы http://discovery-lab.su/index.html. Реакция SOP приведена в таблице ниже.
А вот схема, показывающая, из чего состоит заголовок Origin.
Cross-Origin Resource Sharing (CORS)
Раньше сайтам требовалось взаимодействовать друг с другом, но SOP блокировала множество таких запросов. Тогда люди придумали механизм CORS (Cross-Origin Resource Sharing), который предназначался для смягчения политики SOP.
Вот чуть более подробное описание из справки Mozilla:
Теперь давай разберемся с двумя заголовками, на которые предстоит чаще всего обращать внимание: Access-Control-Allow-Origin и Access-Control-Allow-Credentials.
Access-Control-Allow-Origin
Заголовок ответа Access-Control-Allow-Origin показывает, с какого источника может быть доступен ответ сервера.
Возможные значения:
Access-Control-Allow-Credentials
В зависимости от заголовков, межсайтовые запросы могут быть переданы без куки или заголовка авторизации. Впрочем, если задана настройка CORS Access-Control-Allow-Credentials: true, то сервер может разрешить чтение ответа, когда передаются куки или заголовок авторизации.