Content-Security-Policy: продолжаем бороться с XSS

CSP XSS Content-Security-Policy

Когда я писал про CSRF, то говорил что важно настроить CSP (Content-Security-Policy). Что это такое?

Content-Security-Policy - это дополнительный уровень безопасности, который помогает обнаруживать и смягчать определенные типы атак, включая Cross Scripting (XSS) и атаки на инъекции данных. Эти атаки используются для всего: от кражи данных до повреждения сайта или распространения вредоносного ПО.

Чтобы включить CSP, вам необходимо настроить веб-сервер для возврата HTTP-заголовка Content-Security-Policy.

В качестве альтернативы может использоваться элемент meta для настройки политики, например:

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https: // *; child-src 'none'" />

Примеры: общие случаи использования

Пример 1:

Администратор веб-сайта хочет, чтобы весь контент поступал из собственного источника сайта (это исключает субдомены).

Content-Security-Policy: default-src 'self'
Пример 2:

Администратор веб-сайта хочет разрешить пользователям веб-приложения включать изображения из любого источника в свой собственный контент, но ограничивать аудио- или видеоматериалы доверенными поставщиками и все сценарии только для определенного сервера, на котором размещен доверенный код.

Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com

Здесь по умолчанию содержимое разрешено только из источника документа со следующими исключениями:

  • Изображения могут загружаться из любого места (обратите внимание на «*»).
  • Медиа разрешено только с media1.com и media2.com (а не из поддоменов этих сайтов).
  • Исполняемый скрипт разрешен только с usercripts.example.com.

Включение отчетов

По умолчанию отчеты о нарушении не отправляются. Чтобы включить отчет о нарушении, вам нужно указать директиву политики report-uri, предоставляя по крайней мере один URI для доставки отчетов:

Content-Security-Policy: default-src 'self'; report-uri reportcollector.example.com/collector;

Затем вам нужно настроить сервер для получения отчетов; он может хранить или обрабатывать их любым способом, который, по вашему мнению, является уместным.

Синтаксис отчета о нарушении

JSON отчета содержит следующие данные:

  • blocked-uri URI ресурса, который был заблокирован от загрузки по политике безопасности контента. Если заблокированный URI имеет другое происхождение, чем document-uri, тогда заблокированный URI усекается, чтобы содержать только схему, хост и порт.
  • disposition Либо «enforce», либо «reporting» в зависимости от того, используется ли заголовок Content-Security-Policy-Report-Only или заголовок Content-Security-Policy.
  • document-uri URI документа, в котором произошло нарушение.
  • effective-directive Директива, чья информация вызвала нарушение.
  • original-policy Исходная политика, указанная в HTTP-заголовке Content-Security-Policy.
  • referrer Ссылка на документ, в котором произошло нарушение.
  • script-sample Первые 40 символов встроенного скрипта, обработчика события или стиля, вызвавшего нарушение.
  • status-code Код состояния HTTP ресурса, на котором был создан глобальный объект.
  • violated-directive Название раздела политики, которое было нарушено.