Аудит заголовков
Задание 1Введение
Цель: Знать защитные HTTP-заголовки и проверять их автоматически.
Напишите функцию security_headers(headers). На вход — словарь/объект HTTP-заголовков ответа (имена в любом регистре). Верните список отсутствующих защитных заголовков в таком порядке: Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options, Referrer-Policy.
X-Content-Type-Options считается отсутствующим, если его значение (без пробелов по краям, без учёта регистра) не равно nosniff. Пустое значение у остальных заголовков допустимо.
Задание 2Теория и инструменты
Content-Security-Policy ограничивает источники скриптов и защищает от XSS. Strict-Transport-Security заставляет браузер ходить только по HTTPS.
X-Content-Type-Options: nosniff запрещает браузеру угадывать тип файла, X-Frame-Options защищает от clickjacking, Referrer-Policy ограничивает утечку URL в заголовке Referer.
Имена HTTP-заголовков не чувствительны к регистру — это важно для проверки.
Инструменты
- Python:
dict,str.lower(),str.strip() - securityheaders.com — онлайн-проверка реальных сайтов
Больше теории — в разделе «Обучение: Защита (код)».
Задание 3Практика: напишите код
Примеры
security_headers({"Content-Security-Policy": "default-src \u0027self\u0027", "Referrer-Policy": "no-referrer", "Strict-Transport-Security": "max-age=31536000", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "DENY"})
→ []security_headers({"content-type": "text/html", "server": "nginx"})
→ ["Content-Security-Policy", "Strict-Transport-Security", "X-Content-Type-Options", "X-Frame-Options", "Referrer-Policy"]Ещё 5 скрытых тестов.
Пошаговый план — открывайте по одному шагу
- 1Постройте словарь, где ключи приведены к нижнему регистру.
- 2Пройдите по списку обязательных заголовков в порядке из условия.
- 3Заголовок отсутствует, если его нет в словаре. Для
X-Content-Type-Optionsдополнительно сравните значение сnosniff(обрезав пробелы и без учёта регистра). - 4Верните список отсутствующих.
Подсказки — каждая до решения стоит −10 очков
Задание 4Как защититься
Настройте эти заголовки на веб-сервере (nginx add_header) или в фреймворке и проверяйте их в CI.
Разборы участников
Разборы открываются после того, как вы решите комнату, — чтобы не спойлерить ответ.