18 lines
3.0 KiB
Markdown
18 lines
3.0 KiB
Markdown
# CSP inventory
|
||
|
||
Проверено 13 сентября 2026 года. Production не требует произвольных внешних origin: browser API-запросы идут на текущий домен, изображения скриншотов — только на `FILES_DOMAIN`, шрифты и сборка Astro — локальные.
|
||
|
||
## Inline-данные
|
||
|
||
- динамический JSON-LD в `Layout.astro` остаётся inline, но каждый SSR-ответ получает собственный криптографический nonce;
|
||
|
||
Vite собирает даже малые page scripts и scoped Astro styles в same-origin `_astro` assets (`assetsInlineLimit: 0`). Динамические шкалы используют дискретные CSS-классы вместо style attributes, поэтому `style-src` ограничен `'self'`, а `style-src-attr` — `'none'`. `unsafe-inline` и `unsafe-eval` отсутствуют в основном policy. Inline event handlers запрещены `script-src-attr 'none'`; wildcard и сторонние script origin не разрешены. Production `FILES_DOMAIN` проходит hostname-валидацию и используется через HTTPS. Отдельные HTTP-origin API и MinIO разрешаются только для явных loopback-адресов локального Compose; тогда `upgrade-insecure-requests` не выставляется.
|
||
|
||
## Реализация и проверка
|
||
|
||
1. Page scripts перенесены в собираемые клиентские модули; конфигурация формы передаётся через безопасный `data-state`. Нулевой inline limit запрещает Vite встраивать малые модули обратно в HTML.
|
||
2. Web-runtime создаёт новый nonce для каждого ответа, добавляет его только JSON-LD и выпускает соответствующий CSP-заголовок. Статического nonce нет.
|
||
3. Scoped styles находятся в скомпилированных `_astro` assets, вычисляемые шкалы используют классы с шагом 5%; inline-разрешения для styles и attributes удалены.
|
||
4. Caddy не перезаписывает CSP web-runtime и задаёт строгую политику без nonce только как fallback для API/служебных ответов.
|
||
5. Production bootstrap сверяет policy и nonce на главной, report и admin, а также доступность OG. Signed screenshots разрешены только с валидированного `FILES_DOMAIN`; проверка реальной подписи остаётся в сценарии наполненного production-хранилища. Не добавлять `blob:`, `*` или произвольные CDN для устранения ошибок.
|