Практика/Защита
Чтобы сайт не вскрыли: меры, которые мы закладываем в систему
Защитный чеклист для сайта и админки: секреты, права, формы, пароли, загрузки. Не список атак - карта дыр, которые мы закрываем, когда собираем продукт.
22.08.2026
Это меры защиты, которые мы закладываем в систему. Не инструкция, как атаковать чужой сайт.
Новый сайт часто ломают не «хакеры из кино», а привычки сборки: ключ в репозитории, проверка роли только в браузере, форма, которая принимает всё подряд. Ниже - защитный чеклист. Это не инструкция, как вскрыть чужой сайт, и не обещание «неуязвим». Это то, что мы проверяем, когда выращиваем систему.
Секреты не в git и не во фронте
Файл .env с паролем базы и ключами API не должен попадать в GitHub. Приватный ключ платёжки или LLM не живут в JavaScript бандле: всё, что ушло в браузер, можно прочитать. На клиенте оставляют только публичные идентификаторы, которые и задуманы как публичные.
Права считает сервер
Выключенный RLS в базе, «админка скрыта CSS-ом», проверка роли только в React - это одна семья ошибок. Запрос с другого инструмента обойдёт интерфейс. Строка, которую человек может читать и менять, решается на сервере и в политике базы.
Формы и запросы
Нет ограничения частоты - можно подбирать пароль или забить форму спамом. Склейка SQL из поля ввода - классика, которую закрывают параметрами запроса, а не «надеждой на честного пользователя». Входящие данные режут по типу, длине и смыслу: не «принять весь JSON и записать в профиль», иначе пользователь припишет себе роль администратора.
Контент людей и XSS
Если отзыв, комментарий или имя вставляют в страницу как сырой HTML, в сайт можно встроить чужой скрипт. Текст сохраняют как текст и показывают как текст. Исключения - узкий набор тегов, который вы сами разрешили.
Пароли и сессии
Пароли не хранят открытым текстом и не хешируют устаревшим способом «для скорости». Их сверяют с базами известных утечек, чтобы человек не ставил qwerty после третьего взлома чужого сервиса. Токен сессии в localStorage удобно украсть скриптом; для админки мы предпочитаем httpOnly-cookie.
Админка, CORS, предсказуемые адреса
Кабинет без входа - это не «пока тестовый стенд», это открытая дверь. CORS со звёздочкой отдаёт API любому сайту в браузере пользователя. Номера заявок 1, 2, 3 позволяют листать чужие данные, если нет проверки «это ваша запись». Почту при регистрации подтверждают, чтобы кабинет не заняли чужим ящиком.
Вебхуки, ошибки, зависимости, файлы
Платёж или мессенджер присылает вебхук - его подписывают, иначе любой может прислать «оплату прошла». Подробный stacktrace в ответе клиенту рисует карту внутренностей. Зависимости без обновлений копят известные дыры. Загрузка файлов без типа, размера и отдельного хранения - способ положить исполняемый файл туда, откуда его откроет браузер.
Что добавляем сверх коротких списков из роликов
HTTPS и заголовки вроде CSP. Бэкапы, которые реально восстанавливали. 2FA на кабинет. Защита от CSRF. Чтобы из корня сайта не торчал .git и архив «backup.zip». Чтобы не было пароля admin/admin. Чтобы секреты ротировали, а доступ к персональным данным был в журнале.
Каждый пункт - отдельная тема в рубрике «Защита». Хаб нужен, чтобы владелец бизнеса увидел карту целиком и понял: безопасность - не плагин «поставить антивирус», а часть архитектуры.
Как это связано с пакетами
В аудите мы находим, где дыра уже стоит денег. В «Системе» закрываем контур: заявки, роли, хранения, интеграции. Если нужен разбор конкретного пункта - напишите в форму, разберём на вашем контуре, а не на абстрактном чеклисте.