Content Security Policy

Content Security Policy (CSP) — это механизм безопасности, который помогает защитить веб-приложения от ряда атак, таких как межсайтовые скрипты (XSS) и внедрение вредоносных контента. CSP даёт возможность веб-разработчикам контролировать, какие ресурсы могут быть загружены и выполнены на страницах их сайта.

CSP реализуется через HTTP-заголовок или метатег <meta> в HTML-документе. Этот механизм предоставляет строгие правила для загрузки контента, включая скрипты, стили, изображения, шрифты и другие ресурсы. Важной особенностью CSP является возможность блокировать выполнение скриптов, которые не соответствуют указанным правилам.

CSP основывается на создании “политики” для загрузки ресурсов. Политика представляется в виде строки, состоящей из множества директив, которые задают источники для различных типов контента. Например, можно указать, что скрипты можно загружать только с определённых доменов или даже только с того же домена, что и сам сайт.

Структура политики CSP

Политика CSP состоит из директив и значений, которые определяют разрешённые источники для различных типов ресурсов:

  • default-src — задаёт общий источник для большинства типов контента, если для них не указана отдельная директива.
  • script-src — источники для скриптов.
  • style-src — источники для стилей.
  • img-src — источники для изображений.
  • font-src — источники для шрифтов.
  • connect-src — источники для сетевых соединений (например, XMLHttpRequest, WebSocket).
  • object-src — источники для плагинов и объектов, таких как Flash или Java applets.

Пример базовой политики 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

Без использования CSP веб-приложение становится уязвимым для множества атак, особенно для межсайтовых скриптовых атак (XSS). В таких атаках вредоносный код вставляется в страницу через пользовательский ввод или внешние ресурсы. Без должной защиты злоумышленник может вставить вредоносный скрипт, который будет выполнен на стороне клиента, с целью кражи данных пользователя, внедрения рекламы или иных вредоносных действий.

Применение CSP ограничивает выполнение таких скриптов, а также может предотвратить загрузку внешних опасных ресурсов.

Виды директив CSP

Каждая директива CSP задаёт источники для определённого типа контента. Рассмотрим наиболее часто используемые.

default-src

Эта директива является универсальной и задаёт политику для большинства типов ресурсов, если для них не указана своя директива. Важно, что она работает как “резервное” правило.

Пример:

Content-Security-Policy: default-src 'self';

В данном примере все ресурсы, такие как изображения, стили и скрипты, могут загружаться только с того же домена.

script-src

Директива script-src ограничивает источники для загрузки и выполнения JavaScript. Важно, что она является одной из самых важных директив, так как JavaScript может быть использован для выполнения вредоносных действий.

Пример:

Content-Security-Policy: script-src 'self' https://apis.example.com;

Здесь разрешается загружать и выполнять скрипты только с того же домена и с https://apis.example.com.

Использование nonce и hash для скриптов

Для предотвращения выполнения вредоносных инлайн-скриптов можно использовать nonce (одноразовый токен), который генерируется на сервере и вставляется в атрибут nonce тега <script>.

Пример:

Content-Security-Policy: script-src 'self' 'nonce-xyz123';

В таком случае скрипты, которые содержат атрибут nonce="xyz123", будут разрешены.

style-src

Директива style-src ограничивает источники для загрузки стилей. Для защиты от атак XSS также можно ограничить выполнение инлайн-стилей.

Пример:

Content-Security-Policy: style-src 'self' https://fonts.example.com;

img-src

Директива img-src контролирует, с каких источников могут загружаться изображения. Например, если нужно загружать изображения только с конкретного домена или с того же домена, используется такая политика:

Content-Security-Policy: img-src 'self' https://images.example.com;

font-src

Директива font-src ограничивает источники для шрифтов. Важно ограничить этот источник, чтобы предотвратить загрузку шрифтов с неизвестных или ненадёжных сайтов.

Пример:

Content-Security-Policy: font-src 'self' https://fonts.example.com;

object-src

Директива object-src ограничивает источники для объектов, таких как Flash, Java applets и другие активные элементы. Это важная мера безопасности, так как эти объекты могут содержать уязвимости.

Пример:

Content-Security-Policy: object-src 'none';

Этот пример запрещает использование любых объектов на странице.

connect-src

Директива connect-src управляет источниками, с которыми веб-приложение может устанавливать соединения, например, для AJAX-запросов, WebSocket или серверных событий. Она помогает предотвратить утечку данных через нежелательные соединения.

Пример:

Content-Security-Policy: connect-src 'self' https://api.example.com;

frame-src

Эта директива ограничивает источники, с которых могут быть загружены фреймы (<iframe>). Политика безопасности может запретить загрузку фреймов с неизвестных доменов.

Пример:

Content-Security-Policy: frame-src 'self';

Использование CSP в приложении

Чтобы внедрить CSP в веб-приложение, необходимо настроить сервер, чтобы он добавлял нужный HTTP-заголовок. Например, для серверов Apache или Nginx нужно добавить соответствующие правила в конфигурацию.

Настройка CSP на сервере

Для Apache

В конфигурационном файле .htaccess или в основной конфигурации сервера можно добавить следующий код для включения CSP:

Header set Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com; style-src 'self';"

Для Nginx

В конфигурации Nginx нужно добавить директиву add_header:

add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://apis.example.com; style-src 'self';";

Проверка и отладка CSP

Отладка CSP может быть сложной, так как неправильные настройки могут привести к блокировке легитимных ресурсов. Важно использовать отчёты CSP, чтобы понять, какие ресурсы нарушают политику.

Для этого можно использовать директиву report-uri или report-to, которая позволяет отправлять отчёты на сервер, когда нарушается политика.

Пример:

Content-Security-Policy: default-src 'self'; report-uri /csp-violation-report-endpoint;

На сервере можно обрабатывать эти отчёты и анализировать, какие ресурсы нарушают политику безопасности.

Заключение

Content Security Policy — это мощный инструмент для повышения безопасности веб-приложений, позволяющий ограничить загрузку и выполнение небезопасных ресурсов. Применение правильных директив CSP минимизирует риски XSS и других атак, обеспечивая защиту как для пользователей, так и для данных веб-приложений.