Код Middle CSRF, SameSite и CORS обновлено

Проверка источника запроса

Условие

Напишите checkRequest(method, headers, allowed), которая решает, пропускать ли запрос с точки зрения CSRF. headers объект с ключами в нижнем регистре, allowed массив разрешённых origin ("https://app.example.com").

Правила по порядку:

  1. Методы GET, HEAD, OPTIONS пропускаются (они не меняют состояние).
  2. Если есть sec-fetch-site: пропустить, только если он same-origin или none.
  3. Иначе если есть origin: пропустить, только если он точно входит в allowed.
  4. Иначе если есть referer: взять его origin (схема, хост и порт) и проверить по allowed; некорректный URL не пропускать.
  5. Иначе не пропускать.

Примеры

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
  1. Используйте new URL(referer).origin и оберните в try/catch.
  2. Сравнивайте origin точным совпадением со списком.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме