3.0 KiB
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 не выставляется.
Реализация и проверка
- Page scripts перенесены в собираемые клиентские модули; конфигурация формы передаётся через безопасный
data-state. Нулевой inline limit запрещает Vite встраивать малые модули обратно в HTML. - Web-runtime создаёт новый nonce для каждого ответа, добавляет его только JSON-LD и выпускает соответствующий CSP-заголовок. Статического nonce нет.
- Scoped styles находятся в скомпилированных
_astroassets, вычисляемые шкалы используют классы с шагом 5%; inline-разрешения для styles и attributes удалены. - Caddy не перезаписывает CSP web-runtime и задаёт строгую политику без nonce только как fallback для API/служебных ответов.
- Production bootstrap сверяет policy и nonce на главной, report и admin, а также доступность OG. Signed screenshots разрешены только с валидированного
FILES_DOMAIN; проверка реальной подписи остаётся в сценарии наполненного production-хранилища. Не добавлятьblob:,*или произвольные CDN для устранения ошибок.