Вопрос или проблема
Сегодня я обсуждал с PenTesters в своей компании, которые сказали, что заголовки безопасности, такие как, например, Content-Security-Policy, Strict-Transport-Security, Referrer-Policy и Permissions-Policy, всегда должны отправляться в последующих запросах в рамках одной страницы (например, изображения, Angular), даже если они уже были отправлены с основным запросом (в нашем случае это страница JSF).
Мое понимание всегда заключалось в том, что эти вещи наследуются от основного запроса к последующему запросу и не добавляют никакой безопасности, если отправляются с ними.
Помимо аргумента, что они не добавляют много по размеру, есть ли какие-то причины включать их в последующий запрос? С точки зрения безопасности пользователей или возможности эксплуатации? Я не смог придумать причину, по которой их следует включить.
Пример сетевого трассировки:
https://somehost/request.jsf -> заголовки отправлены
https://somehost/angular-package.js -> заголовков не отправлено
https://somehost/logo.png -> заголовков не отправлено
https://somehost/font1.woff -> заголовков не отправлено
-- Пользователь переходит на другую страницу --
https://somehost/request2.jsf -> заголовки отправлены
https://somehost/angular-package.js -> заголовков не отправлено
https://somehost/additionalImage.png -> заголовков не отправлено
Лучшей практикой является отправка их для всех типов файлов. Действительно, что хотя бы Content-Security-Policy
имеет отношение только к документам, но документом может быть как XML-файл, так и SVG-изображение (которое также является XML-документом), наряду с обычной HTML-страницей. Я не уверен, влияет ли встроенный просмотрщик PDF в браузере на Content-Security-Policy
, но если это так, то это тоже будет тип файла, который стоит включить. Если вы будете включать их во все запросы, то вам не придется перечислять все возможные типы файлов, что, вероятно, приведет к тому, что вы упустите что-то важное, что может быть болезненно для безопасности. Некоторые браузеры также выполняют определение типа содержимого и, следовательно, могут думать, что что-то является документом, когда это не так, что также может привести к ситуации, чувствительной к безопасности, если вы не включите заголовки во все запросы.
Что касается Strict-Transport-Security
, он должен всегда отправляться на всех страницах, поскольку пользователь может получить доступ к ссылке на конкретный ресурс (например, изображение), и как только это делается через защищенный канал, последующие запросы всегда будут безопасными.
Ответ или решение
Безопасностные заголовки: Нужно ли их отправлять в последующих запросах (например, для скриптов, изображений) после отправки с основным HTML-запросом?
Вопрос о необходимости отправки заголовков безопасности для последующих запросов (таких как запросы к скриптам, изображениям и другим ресурсам) является актуальным для обеспечения безопасности веб-приложений. В этой статье мы подробно рассмотрим, необходимы ли заголовки безопасности на каждом последующем запросе, и какие факторы следует учитывать.
Что такое заголовки безопасности?
Заголовки безопасности — это специальные HTTP-заголовки, которые помогают повысить безопасность веб-приложений. Вот несколько примеров:
- Content-Security-Policy (CSP): защищает от атак типа XSS, указывая, какие скрипты и стили могут загружаться.
- Strict-Transport-Security (HSTS): заставляет браузер обмениваться данными только по защищенному каналу (HTTPS).
- Referrer-Policy: контролирует, какую information (URL страницы-отправителя) можно отправлять при переходе по ссылкам.
- Permissions-Policy: ограничивает, какие API браузера могут использоваться в контексте страницы.
Должны ли заголовки безопасности отправляться на последующих запросах?
Существует мнение, что заголовки безопасности, такие как CSP или HSTS, должны отправляться не только с основными HTML-запросами, но и со всеми последующими запросами. Вот несколько причин, почему это является лучшей практикой:
-
Наследование заголовков:
- Несмотря на то, что некоторые заголовки могут наследоваться от основного документа, это не всегда безопасно или надежно. Например, существует возможность, что браузер может неправильно интерпретировать тип содержимого, использовавший разные типы MIME, или может возникнуть небезопасная ситуация при загрузке различных ресурсов.
-
Разнообразие форматов:
- Некоторые заголовки, такие как CSP, могут быть актуальны для файлов формата XML или SVG, а также PDF-документов. Если вы не укажете заголовки для всех ресурсов, существует риск неявных уязвимостей, которые могут быть использованы злоумышленниками.
-
Прямые запросы к ресурсам:
- Пользователь может напрямую обратиться к ресурсам, таким как изображения, шрифты или JavaScript, например, через прямую ссылку. В этом случае заголовки безопасности не будут применены, если вы не отправите их с каждым запросом к этим ресурсам.
-
Content-Type Sniffing:
- Некоторые браузеры могут выполнять типовое снюфинг (content-type sniffing), что может привести к неверной интерпретации типа загружаемого содержимого. Если браузер решит, что ресурс имеет документный тип, он может обрабатывать его так, как если бы это был HTML или XML, что вновь открывает двери для возможных атак.
Бизнес-ценность
С точки зрения бизнеса, соблюдение лучших практик безопасности может существенно снизить вероятность успешных атак, сохранить доверие клиентов и защитить репутацию компании. Если уязвимости позволят злоумышленникам получить доступ к конфиденциальной информации или повредить систему, последствия могут быть катастрофическими.
Рекомендации
- Отправляйте заголовки безопасности для всех ресурсов: это расширит охват безопасности и снизит риск утечек информации.
- Регулярно анализируйте конфигурацию серверов: используйте инструменты для проверки присутствия заголовков безопасности на всех типах запросов.
- Обучайте команду безопасности: проводите семинары и обсуждения по актуальным вопросам безопасности веб-приложений, чтобы гарантировать осведомленность о современных угрозах и мерах защиты.
Заключение
Итак, в ответ на вопрос, нужно ли отправлять заголовки безопасности для последующих запросов, можно с уверенностью сказать: да, это рекомендуется. Это не только улучшит уровень безопасности вашего веб-приложения, но и защитит вашу организацию от потенциальных угроз в интернете. Выбор отправлять заголовки безопасности на каждом запросе — это проактивный шаг к созданию более безопасной и надежной онлайн-среды.