README: как защищён путь админки (путь не попадает ни в HTML, ни в JSON)

This commit is contained in:
2026-10-10 12:55:27 +03:00
parent 34a46b6832
commit 3977b0da47

View File

@@ -302,6 +302,28 @@ ADMIN_PASSWORD=<длинный пароль>
адреса блокируется на `ADMIN_LOCKOUT_MINUTES` минут (по умолчанию 15). Сессия —
подписанная cookie на 12 часов.
### Как защищён путь админки
- путь задаётся только в `.env` и больше нигде не хранится: ни в HTML, ни в
JSON, ни в JS — неавторизованный пользователь его нигде не увидит;
- кнопка «Админка» на главной показывается только вошедшему (сервер проверяет
cookie и добавляет в страницу лишь флаг, без пути) и ведёт на служебный
`/api/admin/goto`, который отвечает редиректом (302) на секретный путь —
поэтому путь не попадает в разметку и его не вычитает краулер;
- без валидной сессии `/api/admin/*` отвечает `401`, на неизвестных путях сайт
отдаёт обычный 404 — перебором путь не находится;
- страница панели отдаётся с заголовками `X-Robots-Tag: noindex, nofollow,
noarchive`, `Referrer-Policy: no-referrer` (путь не утечёт во внешние ссылки
через Referer), `X-Frame-Options: DENY` и `Cache-Control: no-store`;
- в `robots.txt` пути нет (там только `Disallow: /api/`) — иначе мы бы сами его
опубликовали; внешние ссылки в панели открываются с `rel="noopener noreferrer"`;
- при желании путь можно убрать и из логов nginx: добавить в конфиг сайта
`location = <ADMIN_PATH> { access_log off; }`.
Остаётся только история браузера у самого админа — это неизбежно (браузер должен
знать, куда идти), поэтому панель лучше открывать с личного устройства, а путь
держать в менеджере паролей.
Настройки (ссылка, интервал, история входов) хранятся в `SETTINGS_FILE`
(по умолчанию `data/settings.json` в корне проекта; в docker — в томе
`schedule_data`). Если файл недоступен для записи, изменения живут в памяти до