From 76bf9f1cf7b66dc08ae77c95c2697e02d4b10b18 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Sun, 13 Sep 2026 11:03:15 +0000 Subject: [PATCH] =?UTF-8?q?chore(caddy):=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B1=D0=B5=D0=B7=D0=BE=D0=BF=D0=B0?= =?UTF-8?q?=D1=81=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=83=D0=B1=D0=BB=D0=B8=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=D0=B5=D0=BD=D0=B0=20=D0=9C=D0=B5=D1=80=D1=8B?= =?UTF-8?q?,=20=D0=BB=D0=B8=D1=81=D1=82=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=B0?= =?UTF-8?q?=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0=20=D0=BF=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=8C=D1=8E=20=D0=B2=D1=8B=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD?= =?UTF-8?q?=20(#3519)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- caddy/sites/apps.caddy | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/caddy/sites/apps.caddy b/caddy/sites/apps.caddy index 1bc227e7..ca670588 100644 --- a/caddy/sites/apps.caddy +++ b/caddy/sites/apps.caddy @@ -184,10 +184,13 @@ gendsgn.ru { } # Static HTML mockups для review (audit alternatives). - # Public access — без auth (по запросу 2026-05-17). + # Public access — без auth (по запросу 2026-05-17) — это намеренно и + # менять НЕ надо. Но каталог не должен листингом отдавать список + # файлов случайному посетителю: без `browse` file_server продолжает + # отдавать сами файлы по прямой ссылке, просто без index-листинга. handle_path /preview/* { root * /srv/preview - file_server browse + file_server } # Trade-In UI preview — public CI surface (#801). Рендерит mock-фикстуру @@ -400,6 +403,36 @@ www.gendsgn.ru { meraocenka.ru { encode zstd gzip + # #3471 (security-headers follow-up): публичный B2C-домен без базовых + # security-заголовков. Позиция директивы в файле не важна — Caddyfile + # применяет директивы в фиксированном порядке (`header` идёт раньше + # `reverse_proxy`), не по строке в исходнике. + # + # Проверено: ни tradein-mvp/frontend (обслуживает этот домен, отдаёт + # `/trade-in/mera-public*`), ни его next.config.ts/middleware не + # выставляют ни один из этих заголовков — дублирования нет. + header { + # 180 суток (15552000s). НЕ ставить includeSubDomains и НЕ ставить + # preload — оба флага практически необратимы (браузеры кэшируют + # preload-список надолго, includeSubDomains ломает любой будущий + # HTTP-поддомен), а не все поддомены meraocenka.ru гарантированно + # под нашим контролем. Если это когда-нибудь понадобится — отдельное + # осознанное решение, не «улучшение по умолчанию». + Strict-Transport-Security "max-age=15552000" + # Запрет встраивания во фрейм: X-Frame-Options — для старых + # клиентов, которые не понимают CSP; frame-ancestors — современный + # механизм. Оба вместе, не один вместо другого. + X-Frame-Options "DENY" + Content-Security-Policy "frame-ancestors 'none'" + X-Content-Type-Options "nosniff" + Referrer-Policy "strict-origin-when-cross-origin" + # Не даём стеку светиться в ответе. Полноценный CSP + # (default-src/script-src/...) сюда намеренно НЕ входит — отдельная + # работа с риском сломать фронт, здесь только периметр вокруг фрейма. + -Server + -X-Powered-By + } + log { output file /var/log/caddy/meraocenka.ru.log }