Files
rf4-spotter/docs/csp-inventory.md
T

3.0 KiB
Raw Blame History

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 для устранения ошибок.