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

18 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 для устранения ошибок.