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.
Ссылки по теме:
- Установка метрики Яндекса на сайт с CSP
- Content Security Policy Level 3
- Secure ("безопасные") и HttpOnly cookies
- XSS