Content Security Policy (CSP) — это механизм безопасности, который помогает защитить веб-приложения от ряда атак, таких как межсайтовые скрипты (XSS) и внедрение вредоносных контента. CSP даёт возможность веб-разработчикам контролировать, какие ресурсы могут быть загружены и выполнены на страницах их сайта.
CSP реализуется через HTTP-заголовок или метатег
<meta> в HTML-документе. Этот механизм предоставляет
строгие правила для загрузки контента, включая скрипты, стили,
изображения, шрифты и другие ресурсы. Важной особенностью CSP является
возможность блокировать выполнение скриптов, которые не соответствуют
указанным правилам.
CSP основывается на создании “политики” для загрузки ресурсов. Политика представляется в виде строки, состоящей из множества директив, которые задают источники для различных типов контента. Например, можно указать, что скрипты можно загружать только с определённых доменов или даже только с того же домена, что и сам сайт.
Политика CSP состоит из директив и значений, которые определяют разрешённые источники для различных типов ресурсов:
Пример базовой политики CSP:
Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.example.com; style-src 'self' https://fonts.example.com;
В этом примере:
'self').https://apis.example.com.https://fonts.example.com.Без использования CSP веб-приложение становится уязвимым для множества атак, особенно для межсайтовых скриптовых атак (XSS). В таких атаках вредоносный код вставляется в страницу через пользовательский ввод или внешние ресурсы. Без должной защиты злоумышленник может вставить вредоносный скрипт, который будет выполнен на стороне клиента, с целью кражи данных пользователя, внедрения рекламы или иных вредоносных действий.
Применение CSP ограничивает выполнение таких скриптов, а также может предотвратить загрузку внешних опасных ресурсов.
Каждая директива CSP задаёт источники для определённого типа контента. Рассмотрим наиболее часто используемые.
Эта директива является универсальной и задаёт политику для большинства типов ресурсов, если для них не указана своя директива. Важно, что она работает как “резервное” правило.
Пример:
Content-Security-Policy: default-src 'self';
В данном примере все ресурсы, такие как изображения, стили и скрипты, могут загружаться только с того же домена.
Директива script-src ограничивает источники для загрузки
и выполнения JavaScript. Важно, что она является одной из самых важных
директив, так как JavaScript может быть использован для выполнения
вредоносных действий.
Пример:
Content-Security-Policy: script-src 'self' https://apis.example.com;
Здесь разрешается загружать и выполнять скрипты только с того же
домена и с https://apis.example.com.
Для предотвращения выполнения вредоносных инлайн-скриптов можно
использовать nonce (одноразовый токен), который генерируется на сервере
и вставляется в атрибут nonce тега
<script>.
Пример:
Content-Security-Policy: script-src 'self' 'nonce-xyz123';
В таком случае скрипты, которые содержат атрибут
nonce="xyz123", будут разрешены.
Директива style-src ограничивает источники для загрузки
стилей. Для защиты от атак XSS также можно ограничить выполнение
инлайн-стилей.
Пример:
Content-Security-Policy: style-src 'self' https://fonts.example.com;
Директива img-src контролирует, с каких источников могут
загружаться изображения. Например, если нужно загружать изображения
только с конкретного домена или с того же домена, используется такая
политика:
Content-Security-Policy: img-src 'self' https://images.example.com;
Директива font-src ограничивает источники для шрифтов.
Важно ограничить этот источник, чтобы предотвратить загрузку шрифтов с
неизвестных или ненадёжных сайтов.
Пример:
Content-Security-Policy: font-src 'self' https://fonts.example.com;
Директива object-src ограничивает источники для
объектов, таких как Flash, Java applets и другие активные элементы. Это
важная мера безопасности, так как эти объекты могут содержать
уязвимости.
Пример:
Content-Security-Policy: object-src 'none';
Этот пример запрещает использование любых объектов на странице.
Директива connect-src управляет источниками, с которыми
веб-приложение может устанавливать соединения, например, для
AJAX-запросов, WebSocket или серверных событий. Она помогает
предотвратить утечку данных через нежелательные соединения.
Пример:
Content-Security-Policy: connect-src 'self' https://api.example.com;
Эта директива ограничивает источники, с которых могут быть загружены
фреймы (<iframe>). Политика безопасности может
запретить загрузку фреймов с неизвестных доменов.
Пример:
Content-Security-Policy: frame-src 'self';
Чтобы внедрить CSP в веб-приложение, необходимо настроить сервер, чтобы он добавлял нужный HTTP-заголовок. Например, для серверов Apache или Nginx нужно добавить соответствующие правила в конфигурацию.
В конфигурационном файле .htaccess или в основной
конфигурации сервера можно добавить следующий код для включения CSP:
Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com; style-src 'self';"
В конфигурации Nginx нужно добавить директиву
add_header:
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com; style-src 'self';";
Отладка CSP может быть сложной, так как неправильные настройки могут привести к блокировке легитимных ресурсов. Важно использовать отчёты CSP, чтобы понять, какие ресурсы нарушают политику.
Для этого можно использовать директиву report-uri или
report-to, которая позволяет отправлять отчёты на сервер,
когда нарушается политика.
Пример:
Content-Security-Policy: default-src 'self'; report-uri /csp-violation-report-endpoint;
На сервере можно обрабатывать эти отчёты и анализировать, какие ресурсы нарушают политику безопасности.
Content Security Policy — это мощный инструмент для повышения безопасности веб-приложений, позволяющий ограничить загрузку и выполнение небезопасных ресурсов. Применение правильных директив CSP минимизирует риски XSS и других атак, обеспечивая защиту как для пользователей, так и для данных веб-приложений.