Какова необходимость в CSP (Content Security Policy)
Для того чтобы понять, зачем существует CSP, нужно знать, что он из себя представляет. CSP (Content Security Policy) - это HTTP-заголовок, которым сервер говорит браузеру, что странице разрешено загружать и выполнять - скрипты - стили - картинки - iframe - и другие ресурсы То есть главная цель CSP - уменьшить площадь для атак на ваш сервис при помощи специальных директив в данном заголовке.
CSP-заголовки бывают 2 режимов
1. Content-Security-Police - Это боевой заголовок. Браузер реально применяет правила и блокирует всё, что нарушает политику.
2. Content-Security-Policy-Report-Only - Это режим наблюдения. Браузер не блокирует нарушение, а только фиксирует его и может отправлять отчёт. Удобно для внедрения CSP без поломки сайта.
Как устроена CSP
Как я вначале указал**, CSP состоит из директив. Каждая директива управляет отдельным типом поведения**: откуда можно загружать скрипты, куда можно отправлять формы, можно ли встраивать страницу в iframe и т.д. В спецификации CSP Level 3 есть официальный реестр таких директив, таких как - script-src - object-src - base-uri
1. Базовая директива
default-src - Это значение по умолчанию для остальных “fetch”-директив, если они отдельно не указаны. Часто с неё начинают жёсткую политику: default-src ‘none’, а потом точечно разрешают нужное. Защищает от лишней загрузки внешних ресурсов “по умолчанию”.
2. Директивы загрузки ресурсов (fetch directives)
script-src - Определяет, откуда можно загружать JavaScript и что можно выполнять как скрипт. Также влияет на inline-скрипты, обработчики событий и другие скриптовые источники. Основная защита — XSS и выполнение нежелательного JavaScript.
img-src - Определяет, откуда можно загружать изображения. Полезно против загрузки картинок с недоверенных доменов и некоторых каналов утечки данных через image-beacon.
frame-src - Определяет, откуда можно загружать iframe/frames. Защищает от встраивания недоверенного содержимого внутрь страницы.
object-src - Определяет, **откуда можно загружать и **. На практике обычно ставят object-src ‘none’, чтобы отключить устаревшие plugin-механизмы. Это снижает риск legacy plugin abuse и лишней исполняемой поверхности.
3. Директивы для навигации и документа
base-url - Определяет, **какое значение можно задавать для HTML **. Защищает от атак, где злоумышленник подменяет base URL и ломает относительные ссылки, загрузку ресурсов или маршрутизацию. _ frame-ancestors_ - Определяет, какие сайты могут встраивать вашу страницу в iframe/frame/object/embed. Это одна из главных защит от clickjacking. По смыслу часто заменяет старый X-Frame-Options.
sandbox - Включает ограниченный режим для документа, похожий на HTML sandbox у iframe: можно урезать скрипты, формы, popups и другие возможности. Полезно для жёсткой изоляции опасного или частично доверенного контента.