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
Owner

Summary

  • meraocenka.ru (публичный B2C-домен) не отдавал ни одного security-заголовка: добавлен блок headerStrict-Transport-Security: max-age=15552000 (180 суток, БЕЗ includeSubDomains/preload — оба флага практически необратимы, не все поддомены под контролем), X-Frame-Options: DENY + Content-Security-Policy: frame-ancestors 'none' (старые клиенты + современный механизм), X-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, снятие Server/X-Powered-By. Полноценный CSP (default-src/script-src) намеренно НЕ вводится — отдельная работа с риском сломать фронт.
  • handle_path /preview/* отдавал листинг каталога (file_server browse) — убран только листинг (browse), публичность самих файлов по прямой ссылке (намеренная, задокументированная) не тронута.

Проверено

  • Грепнул frontend/next.config* и tradein-mvp/frontend/next.config* + middleware на headers()/security-заголовки — tradein-mvp/frontend (обслуживает meraocenka.ru) их не выставляет, дублирования с Next.js нет.
  • docker run --rm -v "<caddy/>:/etc/caddy" caddy:2 caddy validate --config /etc/caddy/sites/apps.caddy --adapter caddyfileValid configuration (до и после правки; относительные import ../*.snippet требуют монтировать родительский caddy/, не caddy/sites/ отдельно).

Test plan

  • caddy validate в CI зелёный (гейт на PR, #2913)
  • После деплоя: curl -sI https://meraocenka.ru/ — проверить Strict-Transport-Security/X-Frame-Options/Content-Security-Policy/X-Content-Type-Options/Referrer-Policy, отсутствие Server/X-Powered-By
  • curl -sI https://meraocenka.ru/preview/ — не должен отдавать HTML-листинг каталога

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Summary - `meraocenka.ru` (публичный B2C-домен) не отдавал ни одного security-заголовка: добавлен блок `header` — `Strict-Transport-Security: max-age=15552000` (180 суток, БЕЗ `includeSubDomains`/`preload` — оба флага практически необратимы, не все поддомены под контролем), `X-Frame-Options: DENY` + `Content-Security-Policy: frame-ancestors 'none'` (старые клиенты + современный механизм), `X-Content-Type-Options: nosniff`, `Referrer-Policy: strict-origin-when-cross-origin`, снятие `Server`/`X-Powered-By`. Полноценный CSP (`default-src`/`script-src`) намеренно НЕ вводится — отдельная работа с риском сломать фронт. - `handle_path /preview/*` отдавал листинг каталога (`file_server browse`) — убран только листинг (`browse`), публичность самих файлов по прямой ссылке (намеренная, задокументированная) не тронута. ## Проверено - Грепнул `frontend/next.config*` и `tradein-mvp/frontend/next.config*` + middleware на `headers()`/security-заголовки — `tradein-mvp/frontend` (обслуживает `meraocenka.ru`) их не выставляет, дублирования с Next.js нет. - `docker run --rm -v "<caddy/>:/etc/caddy" caddy:2 caddy validate --config /etc/caddy/sites/apps.caddy --adapter caddyfile` → `Valid configuration` (до и после правки; относительные `import ../*.snippet` требуют монтировать родительский `caddy/`, не `caddy/sites/` отдельно). ## Test plan - [ ] `caddy validate` в CI зелёный (гейт на PR, #2913) - [ ] После деплоя: `curl -sI https://meraocenka.ru/` — проверить `Strict-Transport-Security`/`X-Frame-Options`/`Content-Security-Policy`/`X-Content-Type-Options`/`Referrer-Policy`, отсутствие `Server`/`X-Powered-By` - [ ] `curl -sI https://meraocenka.ru/preview/` — не должен отдавать HTML-листинг каталога 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 added 1 commit 2026-09-13 10:50:39 +00:00
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
a29bf936e5
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
lekss361 merged commit 76bf9f1cf7 into main 2026-09-13 11:03:16 +00:00
lekss361 deleted branch chore/apps-caddy-security-headers 2026-09-13 11:03:16 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3519
No description provided.