Безопасность и продакшн
Пошаговые рекомендации по безопасному развёртыванию и эксплуатации.
Минимальные требования
- HTTPS на всём сайте (валидный сертификат, HSTS).
- Скрыть/удалить
install.phpи доступ к диагностическим скриптам. - Надёжные пароли у администраторов, ограничить вход по IP/Geo (на уровне сервера).
- Не публиковать и не логировать
API_SECRET, токены платёжных систем иSEED_TOKEN.
Конфигурация окружения
- Вынести чувствительные значения в
config/local.php, не хранить их в VCS. - Проверить часовой пояс и синхронизацию времени (NTP) на веб и Rust серверах.
- Настроить корректный
SITE_URLдля плагинов (с HTTPS и без лишних слэшей). - Ограничить размер запросов и время выполнения в PHP (timeout, memory_limit).
Content Security Policy (CSP)
Включена CSP-политика в конфиге (см. конфигурацию). Разрешены внешние стили/картинки и data URI. Для платежных провайдеров также разрешены form-action на их домены:
Content-Security-Policy: default-src 'self'; base-uri 'self'; frame-ancestors 'self'; form-action 'self' https://unitpay.money https://unitpay.ru https://yoomoney.ru https://pay.freekassa.ru https://enot.io; img-src 'self' data: https:; style-src 'self' 'unsafe-inline' https:; font-src 'self' data: https:; script-src 'self' 'unsafe-inline' https:; connect-src 'self' https:;
При добавлении новых платежных провайдеров и CDN проверьте домены на соответствие CSP. Иначе браузер может блокировать формы/скрипты платежей.
Безопасный доступ к константам
В шаблонах и логике проекта используйте безопасные проверки констант, чтобы исключить ошибки и предупреждения статического анализа:
if (defined('NAME') && constant('NAME')) { /* ... */ }
Флаги включения платежных провайдеров сохраняются в config/local.php и по умолчанию равны false в config/config.php. Такой подход предотвращает падения шаблонов на новых инсталляциях без настроек.
Безопасность роутинга и файлов
- Защита от LFI/Path Traversal: Роутер (
router.php) использует строгие списки разрешенных маршрутов и проверяет существование файлов перед их подключением. Попытки выхода за пределы директории (../../) блокируются. - Защита корзины (Stock Validation): Логика добавления в корзину (
App::addToCart) проверяет наличие товара с учетом уже добавленного количества. Это предотвращает "оверселлинг" (покупку большего количества, чем есть на складе) через множественные запросы. - Валидация суммы платежа: При обработке callback-уведомлений от платежных систем (UnitPay, FreeKassa, ЮMoney, Enot) система строго сверяет полученную сумму с суммой заказа в базе данных. Если сумма меньше ожидаемой (даже на 0.01 руб.), платеж отклоняется, а в лог записывается попытка мошенничества. Это защищает от подмены суммы в форме оплаты.
- AJAX CSRF: Все AJAX-запросы (корзина, фильтры) защищены CSRF-токеном, который передается через заголовок
X-CSRF-Tokenили параметры тела запроса.
UI: фон и формы
- Фон
/rustgif.gifрекомендуется выводить черезbody::before, чтобы избежать мигания и пропадания при прокрутке. - Все формы в админке используют CSRF-токены. Система имеет механизм "самоисцеления" (self-healing): если токен истек, он автоматически обновляется без ошибок для пользователя.
- Скрипт
assets/js/main.jsавтоматически подставляет актуальный CSRF-токен во все POST формы и AJAX запросы, предотвращая ошибки "Token expired".
Доступ к админке
- Изменить базовый префикс админ-панели
ADMIN_BASE_URI(например,/panel). - Добавить базовую защиту на уровне веб-сервера (Basic Auth, ограничение по IP), если возможно.
- Включить CSRF-токены и проверку реферера в формах (если будете расширять функциональность).
RCON (если Rust сервер и сайт на разных машинах)
- Никогда не открывайте RCON порт в интернет «для всех» (0.0.0.0/0). Это фактически доступ к консоли сервера.
- Ограничьте доступ к порту RCON на Rust-сервере: разрешить только IP веб-сервера (где расположен сайт/админка).
- Проверьте параметр
rcon.ip:127.0.0.1подходит только если сайт и Rust на одной машине.- Для внешнего подключения обычно нужен
0.0.0.0или конкретный внешний IP.
- Используйте сложный пароль
rcon.password(20+ символов). - В админке
/admin/connect-shopесть блок «Диагностика RCON» (режим WEBRCON/TCP + причины ошибок).
Логирование и наблюдаемость
- Включить системные логи веб-сервера и PHP (error_log). Не логировать секреты.
- Добавить аудит: логировать выдачи (успех/ошибка), идентификаторы заказов и очереди.
- Подготовить ротацию логов и хранение 7–30 дней.
- Логирование посещений: хранить IP, User-Agent, тип устройства и маршрут. Доступ к деталям только для админов (страница «Аналитика»).
- Соблюдать приватность: не сохранять лишние персональные данные, ограничить срок хранения визитов согласно законодательству (например, 30–90 дней).
Кэширование и производительность
- Включить кеш статических ресурсов (CSS/JS/картинки) через заголовки и CDN.
- Оптимизировать изображения товаров (webp, разумные размеры).
- Проверить индексы БД: поля для поиска/фильтрации и связи (orders, delivery_queue).
Процедуры на проде
- Регулярные бэкапы БД и проверка восстановления (см. раздел «Миграции БД и бэкапы»).
- Тест-покупка на проде низкой суммы и контроль выдачи на тестовом игроке.
- Проверка
rustcms.delivery.test— актуальная связность с сайтом.
Checklist релиза
install.phpудалён, созданinstalled.lock.- Заполнены
API_SECRET,SITE_URL, реквизиты платёжек. - Плагины подключены,
oxide.reloadпроходит без ошибок. - Админ-панель доступна только доверенным пользователям.
- Настроены бэкапы и мониторинг логов.