Content-Security-Policy

Content-Security-Policy (CSP) - позволяет защититься от XSS атак путём указания браузеру адресов с которыми скриптам разрешён обмен данными (GET, POST, XHR, WebSockets и т.п.) и с которых разрешена загрузка файлов (js, css, img). По умолчанию блокируются и инлайн код js и css. 

Указание браузеру делается с помощью заголовка:

Content-Security-Policy: <Имя директивы><атрибуты>;[<Имя директивы><атрибуты>]

Послать заголовок, можно с помощью PHP или в мета теге

<?PHP
header("Content-Security-Policy: default-src 'self';");
?>

в мета теге:

<meta  http-equiv = "Content-Security-Policy"  content = "script-src 'self'">

Здесь директива default-src задаёт политику по умолчанию 'self' - разрешает загрузку только с домена который выдал этот заголовок. Ни скрипты, ни стили, ни фото не будут загружаться с других источников, запрещены и GET и POST из скриптов.

Директивы

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

default-src - задаёт значение по умолчанию для всех директив.
script-src - для js
style-src - для CSS стилей
connect-src - для XHR, WebSockets и EventSource.
font-src - для веб-шрифтов. 
frame-src - для фреймов. 
img-src - для изображений.
media-src - для аудио и видео.
object-src - для Flash и Java.

Атрибуты директив

Для разрешения всех поддоменов используйте символы подстановки (https://*.jed.ru).

Следующие ключевые слова должны указываться в кавычках.

'none' - ничего не разрешать

'self' - разрешает только домен с которого и получен заголовок.

'unsafe-inline' -  используется в директивах script-src и style-src. В первом случае разрешает javascript: и инлайн-обработчики событий (onclick="..."). Во втором разрешает использование style="...".
Этот атрибут может свести к нулю защиту CSP. Лучше не используйте инлайн вставки.

'unsafe-eval' - используется в директиве script-src, разрешает: eval, new Function, setTimeout(' var foo = "bar" ', 1).

'nonce-<случайные символы>' - используется в директивах script-src и style-src. Этот атрибут должен содержать строку случайных символов (латинские буквы и цифры). Это строка должна быть сформирована на сервере отдельно при каждом запросе. Этот же атрибут в той же строкой нужно вставить в элементе script на странице сайта.

<script type="text/javascript" nonce="<случайные символы>">

Запись отчётов СSP

Полезное свойство CSP - посылать отчёт на указанный серверный скрипт, что полезно не только для отладки политик, но и для мониторинга атак.

header("Content-Security-Policy: default-src 'self'; report-uri http://jed.ru/csp-report.php;");

Браузер будет посылать отчёты на ваш PHP скрипт 

csp-report.php:

<?php
header("HTTP/1.0 204 No Response");
$dir = $_SERVER['DOCUMENT_ROOT'].'/../';
$data = file_get_contents('php://input');
$fn = $dir.'csp-report.txt'; // Папка, куда пишем файлы CSP-отчётов
file_put_contents($fn, $data."\n\n\n", FILE_APPEND | LOCK_EX);
?>

Примеры использования

Content-Security-Policy: default-src 'self'; frame-src https://youtube.com; 

Запрещает всё, разрешает родительский домен, разрешает вставку видео с YouTube.

Ссылки по теме:

  1. Установка метрики Яндекса на сайт с CSP
  2. Content Security Policy Level 3
  3. Secure ("безопасные") и HttpOnly cookies
  4. XSS