From c8ff2013456042791db39324b3fbe1b76af4dd49 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sun, 2 Aug 2026 15:22:11 +0300 Subject: [PATCH] =?UTF-8?q?fix(mera/b2c):=20=D1=83=D0=B6=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=B8=D1=82=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B8=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=20=D0=BF=D0=BE=20=D0=B8=D1=82=D0=BE=D0=B3?= =?UTF-8?q?=D0=B0=D0=BC=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20=E2=80=94=20=5F?= =?UTF-8?q?next/static=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=5Fnext,?= =?UTF-8?q?=20=D1=81=D0=BA=D1=80=D0=B0=D0=B1=20X-Authenticated-User?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Матчер статики сужен с /trade-in/_next/* до /trade-in/_next/static/* — тот же, что у @uipreview (Caddyfile:78), проверенный в проде. Широкий вариант открывал анонимам /_next/image (оптимизатор картинок, CPU по запросу), который лэндингу не нужен: next/image, и url() в mera-public не встречаются вообще, картинок нет, шрифты — next/font/google self-hosted в _next/static/media. 2. Во все три reverse_proxy блока добавлен header_up -X-Authenticated-User — единообразие с остальным периметром (:87, :129, :169). Блок не под basic_auth, т.е. анонимный клиент тем более может прислать свой заголовок. Сейчас инертно (лэндинг статичен), но станет дырой на этапе 5, когда откроется публичный /estimate. 3. Регресс-тест на сужение: /trade-in/_next/image должен отдавать 404. --- Caddyfile | 27 +++++++++++++++++++++++---- scripts/smoke-mera-perimeter.sh | 6 ++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/Caddyfile b/Caddyfile index 211d41be..59402dbf 100644 --- a/Caddyfile +++ b/Caddyfile @@ -239,7 +239,16 @@ meraocenka.ru { # Caddy→backend хопа, пользователь /trade-in никогда не видит. handle / { rewrite * /trade-in/mera-public - reverse_proxy tradein-frontend:3000 + reverse_proxy tradein-frontend:3000 { + # Тот же периметр-скраб, что у @uipreview (:87) и @tradein ниже. + # Этот блок вообще не под basic_auth, поэтому анонимный клиент + # тем более может прислать свой X-Authenticated-User. Сейчас + # инертно (лэндинг статичен, backend-вызовов нет), но снимаем + # ради единообразия периметра, а не полагаясь на то, что + # downstream ничего не делает с заголовком — иначе на этапе 5, + # когда откроется публичный /estimate, это станет дырой. + header_up -X-Authenticated-User + } } # Подстраницы САМОГО лэндинга. Нужны с момента мержа #2615: футер ссылается @@ -253,14 +262,24 @@ meraocenka.ru { # под него не подпадает и по-прежнему отдаёт 404. Регресс-тест на это — # в scripts/smoke-mera-perimeter.sh. handle /trade-in/mera-public/* { - reverse_proxy tradein-frontend:3000 + reverse_proxy tradein-frontend:3000 { + header_up -X-Authenticated-User + } } # Next.js уже эмитит ссылки на статику с /trade-in-префиксом (тот же # basePath) — passthrough без rewrite. Нужны для рендера страницы (JS/CSS # чанки), сами по себе не содержат ни B2B-данных, ни секретов. - handle /trade-in/_next/* { - reverse_proxy tradein-frontend:3000 + # + # Именно `static/*`, а не весь `_next/*` — тот же матчер, что у @uipreview + # (:78), который в проде доказал, что этого хватает для рендера. Широкий + # `_next/*` открыл бы анонимам ещё и `/_next/image` (оптимизация картинок, + # CPU-нагрузка по запросу), который на лэндинге не используется вообще: + # next/image в tradein-mvp/frontend/src/app/mera-public/ не импортируется. + handle /trade-in/_next/static/* { + reverse_proxy tradein-frontend:3000 { + header_up -X-Authenticated-User + } } # Allowlist-by-default: любой другой путь (включая B2B — /v2, /admin, diff --git a/scripts/smoke-mera-perimeter.sh b/scripts/smoke-mera-perimeter.sh index b91344e0..cda7725a 100644 --- a/scripts/smoke-mera-perimeter.sh +++ b/scripts/smoke-mera-perimeter.sh @@ -62,6 +62,12 @@ check "meraocenka.ru/v2 — B2B path must 404" "$BASE_MERA/v2" 404 check "meraocenka.ru/trade-in/v2 — B2B path must 404" "$BASE_MERA/trade-in/v2" 404 check "meraocenka.ru/trade-in/api/* — must 404 (не проксируем API)" "$BASE_MERA/trade-in/api/v1/me" 404 +# 2c. Статика проксируется ТОЛЬКО из _next/static/*. Оптимизатор картинок +# /_next/image на лэндинге не нужен (next/image там не импортируется) и +# наружу не открыт — иначе аноним получил бы CPU-нагрузку по запросу. +# Ловит расширение матчера обратно до `/trade-in/_next/*`. +check "meraocenka.ru/_next/image — must 404 (не открываем оптимизатор)" "$BASE_MERA/trade-in/_next/image?url=%2Ftest.png&w=64&q=75" 404 + # 3. B2B-данные trade-in по-прежнему закрыты анониму. # # ВНИМАНИЕ: проверять СТРАНИЦУ (/trade-in/v2) больше нельзя — она отдаёт 200.