chore(caddy): security headers для meraocenka.ru + отключение browse в /preview #3519

Merged
lekss361 merged 1 commit from chore/apps-caddy-security-headers into main 2026-09-13 11:03:16 +00:00

1 commit

Author SHA1 Message Date
bot-backend
a29bf936e5 chore(caddy): security headers для meraocenka.ru + отключение browse в /preview
All checks were successful
CI Trade-In / changes (pull_request) Successful in 14s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 17s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
meraocenka.ru — публичный B2C-домен, не отдавал ни HSTS, ни защиту от
встраивания во фрейм, ни X-Content-Type-Options/Referrer-Policy.
Добавлен блок header: HSTS на 180 суток (без includeSubDomains/preload —
оба флага практически необратимы, не все поддомены под контролем),
X-Frame-Options: DENY + CSP frame-ancestors 'none' (старые клиенты +
современный механизм), nosniff, strict-origin-when-cross-origin, плюс
снятие Server/X-Powered-By. Полноценный CSP (default-src/script-src) —
отдельная работа, здесь только периметр вокруг фрейма. Next.js
(tradein-mvp/frontend) эти заголовки не выставляет — дублирования нет.

handle_path /preview/* отдавал листинг каталога (file_server browse).
Публичность самих макетов намеренная и задокументирована — убран только
листинг, файлы по прямой ссылке продолжают отдаваться.

Проверено: caddy validate --config apps.caddy --adapter caddyfile → Valid
configuration (до и после правки, с учётом относительных import вида
../users.caddy.snippet — apps.caddy валиден только при монтировании
родительского caddy/, не caddy/sites/ отдельно).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
2026-09-13 13:49:38 +03:00