Код Middle CSRF, SameSite и CORS обновлено
Проверка источника запроса
Условие
Напишите checkRequest(method, headers, allowed), которая решает, пропускать ли запрос с точки зрения CSRF. headers объект с ключами в нижнем регистре, allowed массив разрешённых origin ("https://app.example.com").
Правила по порядку:
- Методы
GET,HEAD,OPTIONSпропускаются (они не меняют состояние). - Если есть
sec-fetch-site: пропустить, только если онsame-originилиnone. - Иначе если есть
origin: пропустить, только если он точно входит вallowed. - Иначе если есть
referer: взять его origin (схема, хост и порт) и проверить поallowed; некорректный URL не пропускать. - Иначе не пропускать.
Примеры
checkRequest("GET", {}, ["https://app.example.com"]) // true
checkRequest("POST", {"sec-fetch-site":"same-origin"}, ["https://app.example.com"]) // true
checkRequest("POST", {"sec-fetch-site":"cross-site","origin":"https://app.example.com"}, ["https://app.example.com"]) // false
Как подойти
Подсказки: 2
- Используйте
new URL(referer).originи оберните в try/catch. - Сравнивайте origin точным совпадением со списком.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.