Генератор CSP — політика безпеки вмісту з позначеними підводними каменями
Генератор CSP
Позначте директиви й джерела, і ця сторінка складе коректний однорядковий Content-Security-Policy для заголовка відповіді або тега <meta> — а також примітки, які важливі: які директиви ніколи не переходять до default-src, коли хеш або nonce тихо перевизначає unsafe-inline і що вимикає strict-dynamic. Вбудований генератор хешів SHA-256/384/512 перетворює вбудовані скрипти та стилі на джерела 'sha256-…'. Усе виконується у вашому браузері; нічого не завантажується.
Директиви fetch — звідки може походити вміст
Непозначені директиви просто відсутні в політиці; позначка без обраних джерел ігнорується. 'none' скасовує інші поля у своєму рядку. Поле додаткові джерела приймає список через кому: імена хостів (cdn.example.com), схеми (https:), хеші та nonce з лапками або без них.
директива
'self'
'none'
'unsafe-inline'
'unsafe-eval'
'strict-dynamic'
data:
blob:
додаткові джерела
Директиви документа — що сама сторінка може робити
Ці чотири не переходять до default-src: відсутність їх означає «без обмежень», тож повна політика задає їх явно.
директива
'self'
'none'
додаткові джерела
Перемикачі, nonce і звітність
nonce скрипта
report-uri
report-to
Політика
Поки що нічого не побудовано. Позначте деякі джерела і натисніть Побудувати політику, або завантажте зразок базового рівня OWASP.
Генератор хешів для вбудованих скриптів і стилів
Вставте точний вміст між <script> і </script> (або блоком стилів) — байт у байт, без провідного чи кінцевого переносу рядка — і оберіть алгоритм. Результатом буде джерело 'sha256-…', якого очікує CSP 3.
Результат хешу з'явиться тут.
Розгортайте як заголовок, а не мета-тег, коли можете. Заголовок відповіді — це повна CSP: frame-ancestors, report-uri і report-to працюють лише там, а заголовок застосовується до того, як буде розібрано перший байт HTML. Мета-тег є запасним варіантом для статичних файлів без налаштування сервера. Перевірте заголовки, які ваш сайт справді надсилає, на перевірці заголовків безпеки, а необроблені блоки відповіді розбирайте в парсері HTTP-заголовків.
Самоперевірка Повторно запускає конструктор для фіксованих станів: порядок джерел, взаємне виключення 'none', рядок базового рівня OWASP, лапки nonce і хешів, примітки про відсутність переходу для base-uri / form-action / frame-ancestors, перевизначення unsafe-inline через nonce або хеш, примітки strict-dynamic, назви заголовків Report-Only, виключення для мета-тега, генератор хешів проти незалежно обчислених векторів SHA і негативні сценарії. Нічого нікуди не надсилається.
Що таке політика безпеки вмісту (CSP)?
Одним реченням: CSP — це список дозволених джерел, який сервер надсилає разом зі сторінкою і який точно вказує браузеру, звідки можуть походити скрипти, стилі, зображення та з'єднання — тож навіть якщо зловмисник впровадить HTML, впроваджений скрипт усе одно не завантажиться, бо його джерела немає у списку.
так — непозначена директива успадковує default-src
Директиви документа
base-uri, form-action, frame-ancestors, sandbox
що сама сторінка може робити (бути вбудованою, надсилати форми, розв'язувати відносні URL)
ні — кожну треба задавати явно
Звітність та інше
report-uri, report-to, upgrade-insecure-requests
куди надходять звіти про порушення і оновлення застарілих URL
ні (це не директиви fetch)
Найгостріші підводні камені, по одному абзацу на кожен
'unsafe-inline' проти хешів і nonce. Якщо директива містить nonce або будь-яке джерело хешу, CSP 3 каже, що 'unsafe-inline'ігнорується — він лишається лише для дуже старих браузерів. Тому фраза «ми додали nonce, а unsafe-inline залишили для безпеки» насправді означає, що сучасні браузери примусово застосовують nonce. Генератор позначає таку комбінацію, щоб це було рішенням, а не випадковістю.
strict-dynamic вимикає ваш список дозволених. Із strict-dynamic у script-src джерела-хости, схеми, 'self', 'unsafe-inline' і data: для скриптів ігноруються; важливі лише nonce та хеші, а скрипти, які вони завантажують, можуть завантажувати й інші скрипти. Це сучасний спосіб запускати скрипти-завантажувачі — але тоді решта списку script-src стає декоративною.
Мета-теги другого сорту.frame-ancestors, report-uri і report-to ігноруються в <meta http-equiv>. Генератор показує, які частини вашої політики тихо не застосовуватимуться.
Типові помилки
Починати з default-src * і довгого списку винятків. Працюйте навпаки: жорстке default-src 'self', а потім розширюйте лише ті директиви, яким це потрібно. Вузькі політики голосно відмовляють під час тестування; широкі відмовляють тихо назавжди.
Випустити script-src 'unsafe-inline' 'unsafe-eval' і вважати справу закритою. Така політика майже нічого не блокує з того, що хоче зробити атака XSS. Додайте nonce або хеш до скриптів, додайте strict-dynamic і тримайте report-only увімкненим у продакшені, щоб ловити регресії.
Забути, що default-src не охоплює все.base-uri, form-action, frame-ancestors і sandbox не мають запасного варіанта — найчастіше згадувана прогалина в реальних розгортаннях CSP.
Спершу тестувати в режимі примусового виконання. Запустіть у Report-Only з колектором на тиждень, прочитайте звіти, а потім переключіться на примусове виконання. Політика, що ламає оформлення замовлення, гірша за відсутність політики.
Хешувати пробіли по-різному. Хеш охоплює точні байти вбудованого блоку; «корисний» крок збірки, що обрізає кінцеві переноси рядків, змінює кожен хеш. Генеруйте хеші з того, що постачається, а не з вихідного коду.
Часті запитання (FAQ)
Чи потрібен default-src, якщо я перелічую кожну директиву? Ні, але тримати його як нижню межу — гарна практика: нові директиви fetch у майбутніх браузерах тоді за замовчуванням прийматимуть вашу базову лінію, а не «дозволено».
Що насправді робить upgrade-insecure-requests? Вона велить браузеру переписати кожну URL-адресу http://, яку сторінка завантажила б — зображення, стилі, запити fetch — на https:// перед запитом. Це інструмент міграції; кінцевий стан — сторінки без жодної URL http://.
Nonce чи хеш? Nonce, коли ви контролюєте відповідь сервера (випадкове значення для кожної відповіді, і в заголовку, і в кожному тегу скрипта). Хеш, коли HTML статичний або кешований. Ніколи статичний nonce — nonce, що не змінюється, є просто unsafe-inline із зайвими кроками.
Чому політика доставляється, а порушення не надходять? Перевірте, чи ви в режимі Report-Only (лише звіти), чи report-uri вказує на колектор, що приймає POST, і чи ви також налаштували механізм Reporting-Endpoints / Report-To, який потрібен сучасній директиві report-to.
Чи замінює CSP інші захисти? Ні. Це один шар: продовжуйте екранувати вивід, тримайте cookie з HttpOnly і Secure, зберігайте HSTS. Перевірка заголовків безпеки на цьому сайті оцінює весь набір.