Абсолютно неуязвимых сайтов не существует. Даже хорошо защищённый проект может столкнуться с новой уязвимостью, ошибкой сотрудника, компрометацией подрядчика или атакой на внешний сервис.
Поэтому задача безопасности состоит не только в том, чтобы не допустить взлом. Бизнесу важно снижать вероятность успешной атаки, ограничивать возможный ущерб, быстро замечать подозрительные изменения и уметь восстановить сайт вместе с данными.
Практическая система защиты строится как постоянный процесс:
ответственность → инвентаризация → защита → мониторинг → реагирование → восстановление → улучшение.
Ниже — основные меры, которые стоит проверить владельцу корпоративного сайта, интернет-магазина или веб-сервиса.
Что означает безопасный сайт
Безопасность сайта включает три базовых свойства: конфиденциальность данных, целостность информации и доступность критичных функций. Данные должны быть доступны только тем, кому они нужны; код и настройки нельзя незаметно изменить; сайт должен продолжать работу либо восстанавливаться за приемлемое время.
Одного TLS-сертификата для этого недостаточно. Соединение может быть зашифровано, но злоумышленник всё равно способен использовать слабый пароль, уязвимый плагин, ошибку в правах доступа или небезопасную загрузку файлов.
1. Назначьте ответственного за безопасность
Владелец бизнеса не обязан самостоятельно администрировать сервер или проверять исходный код. Но в компании должен быть человек, который знает, где размещён сайт, кто имеет к нему доступ, когда выполняются обновления, где находятся резервные копии и кому сообщать о сбоях или признаках атаки.
Ответственность может быть распределена между владельцем, внутренним администратором и подрядчиком. Важно зафиксировать, кто отвечает за домен, сервер, CMS, программный код, резервное копирование и экстренное реагирование. Критичные процессы не должны оставаться без владельца или зависеть от одного недоступного специалиста.
2. Составьте список компонентов и доступов
Нельзя защищать то, о существовании чего компания не знает. Зафиксируйте домен и регистратора, DNS, хостинг или VPS, операционную систему, веб-сервер, среды выполнения, CMS, плагины, базу данных, репозитории, CDN, WAF, почту, аналитику, CRM, внешние API, платёжные системы, резервные хранилища и мониторинг.
Для каждого компонента должны быть известны владелец, назначение, способ доступа и порядок восстановления. Отдельно проверьте старые тестовые версии, поддомены, панели администрирования и временные интеграции. Забытый тестовый сайт может содержать копию рабочей базы или устаревшее приложение с известной уязвимостью.
3. Регулярно обновляйте программное обеспечение
Обновлять нужно не только CMS. В контур сайта входят операционная система, веб-сервер, PHP или другие среды выполнения, СУБД, компоненты CMS, серверные и клиентские зависимости, контейнеры, панели управления, агенты мониторинга и резервного копирования.
Неиспользуемые плагины, библиотеки и старые версии сайта лучше удалять, а не хранить «на всякий случай». Даже отключённый компонент может оставаться доступным на сервере и увеличивать поверхность атаки.
Проверяйте обновления до установки на рабочий сайт
Перед изменениями создайте резервную копию, проверьте совместимость на тестовом окружении и подготовьте понятный план отката. После установки нужно проверить основные функции сайта и журналы ошибок. Критичные исправления безопасности нельзя откладывать на месяцы только потому, что сайт пока визуально работает нормально.
4. Защитите учётные записи
Административный доступ часто получают не через сложную техническую атаку, а через украденный пароль, фишинг или скомпрометированное устройство.
Для CMS, хостинга, сервера, регистратора домена, корпоративной почты, репозитория, базы данных и резервного хранилища должны использоваться разные пароли. Хранить их следует в менеджере паролей, а не в общей таблице, переписке или файле на рабочем столе.
На критичных аккаунтах необходимо включить многофакторную аутентификацию. В первую очередь это касается почты, регистратора домена, облачного провайдера, репозитория, CMS, менеджера паролей и панели резервного копирования. Для наиболее важных учётных записей предпочтительнее методы, устойчивые к фишингу, если сервис их поддерживает.
Не используйте общие учётные записи
У каждого сотрудника и подрядчика должен быть собственный доступ с необходимым минимумом прав. Это позволяет понимать, кто выполнил действие, и закрывать доступ конкретному человеку без смены общего пароля для всей команды.
5. Соблюдайте принцип минимальных прав
Пользователь, приложение и системный процесс должны иметь только те права, которые необходимы для работы. Редактору контента не нужен доступ к системным настройкам, SEO-специалисту — к серверу, а веб-приложение не должно подключаться к базе под административным пользователем.
Каталог загрузок не должен позволять выполнять PHP-файлы, подрядчику не следует выдавать бессрочный доступ, а резервный скрипт не должен иметь возможность изменять рабочий сайт.
Проверяйте доступы при кадровых изменениях
После увольнения сотрудника, завершения проекта или смены подрядчика необходимо отозвать учётные записи, SSH-ключи, API-токены и активные сессии. Если использовались общие секреты, их следует заменить. Одного изменения пароля CMS недостаточно, когда у человека оставался доступ к хостингу, почте, репозиторию или резервным копиям.
6. Храните пароли и ключи отдельно от исходного кода
В репозиторий не должны попадать пароли баз данных, API-ключи, SMTP-пароли, ключи платёжных систем, SSH-ключи, токены ботов, секреты вебхуков, ключи шифрования и резервные коды MFA.
Секреты следует передавать приложению через защищённую конфигурацию, переменные окружения или специализированное хранилище. Для каждого ключа нужно понимать, какой системе он принадлежит, какие права предоставляет, кто может его прочитать и как быстро его заменить или отозвать.
Если секрет попал в публичный репозиторий или открытую переписку, простого удаления недостаточно. Его нужно отозвать и выпустить новый.
7. Правильно настройте HTTPS, cookie и заголовки безопасности
HTTPS необходим для всего сайта, а не только для формы обратной связи или страницы оплаты. Все HTTP-адреса должны перенаправляться на HTTPS, сертификат — продлеваться автоматически, а срок его действия — контролироваться мониторингом. На страницах не должно быть смешанного контента, внутренние ссылки и canonical также должны использовать защищённый протокол.
Защитите авторизационные cookie
Для cookie сессии обычно применяются параметры Secure, HttpOnly и SameSite. Они ограничивают передачу cookie, доступ к ним из JavaScript и межсайтовые запросы. Конкретные значения зависят от архитектуры приложения.
Используйте защитные HTTP-заголовки
В зависимости от проекта могут применяться Content Security Policy, Strict-Transport-Security, X-Content-Type-Options, Referrer-Policy, Permissions-Policy и запрет встраивания сайта во фрейм.
Заголовки нельзя бездумно копировать из случайного примера. Слишком жёсткая CSP способна сломать сайт, а неверно настроенный HSTS — осложнить доступ к поддоменам.
8. Проверяйте входные данные и права доступа
Нельзя доверять данным только потому, что они пришли из собственной формы, мобильного приложения или JavaScript-интерфейса. На сервере необходимо проверять параметры URL, поля форм, JSON и XML, cookie, заголовки запросов, имена файлов, данные внешних API и значения, ранее сохранённые в базе.
Используйте параметризованные запросы
Данные пользователя нельзя напрямую подставлять в SQL-запрос. Для работы с базой следует применять подготовленные выражения и корректное связывание параметров.
Экранируйте данные по контексту вывода
Значение, выводимое в HTML, атрибуте, JavaScript, CSS или URL, требует соответствующей обработки. Универсального фильтра, одинаково безопасного для всех контекстов, не существует.
Проверяйте права на каждое действие
Скрытая кнопка не является контролем доступа. Сервер должен при каждом запросе определять пользователя, его роль, принадлежность запрошенного объекта и допустимость действия в текущем состоянии.
9. Безопасно обрабатывайте загружаемые файлы
Загрузка файлов — одна из наиболее рискованных функций сайта. Нельзя доверять расширению, имени, MIME-типу, переданному браузером, или тому, что файл открывается как изображение либо документ.
Минимальная защита включает:
- разрешение только необходимых форматов и проверку реального типа содержимого;
- ограничение размера и генерацию нового имени на сервере;
- хранение вне webroot, когда это возможно, и запрет выполнения файлов в каталоге загрузок;
- проверку прав доступа, удаление временных файлов и отсутствие внутренних путей в ответах пользователю.
Если файл предназначен только определённому клиенту, безопаснее выдавать его через контроллер, который проверяет авторизацию и права пользователя.
10. Защитите сервер и конфигурацию
Безопасный программный код не компенсирует открытую панель управления, лишние службы или неправильные права файлов.
На рабочем сервере не должны оставаться тестовые панели, демонстрационные приложения, публичные дампы базы, архивы старых версий сайта, отладочные страницы и неиспользуемые сетевые службы. Публично следует оставлять только действительно необходимые порты и сервисы.
Административные интерфейсы можно дополнительно закрывать через VPN, ограничения по IP, дополнительную аутентификацию, MFA и ограничение частоты запросов.
Не используйте чрезмерные права файлов
Права вроде 777 не являются нормальным способом исправить ошибку доступа. Приложение должно иметь возможность записи только в каталоги, где это действительно необходимо: кэш, сессии, временные файлы и пользовательские загрузки.
Не показывайте технические ошибки посетителям
Посетитель не должен видеть полные пути файлов, SQL-запросы, трассировки исключений, переменные окружения, версии внутренних компонентов или фрагменты конфигурации. Подробности записываются в защищённый журнал, а пользователю возвращается нейтральное сообщение.
11. Создавайте резервные копии и проверяйте восстановление
Наличие архива ещё не означает, что сайт можно восстановить. Копия может оказаться неполной, повреждённой, созданной уже после заражения, зашифрованной злоумышленником или недоступной из-за потери аккаунта.
В резервную копию должны попадать база данных, пользовательские файлы, конфигурация веб-сервера и системных служб, cron-задачи, инструкции по развёртыванию и другие данные, без которых невозможно запустить проект в чистом окружении.
Копии нельзя хранить только на том же сервере, что и рабочий сайт. Нужны отдельное хранилище, несколько точек восстановления, контроль успешности копирования и ограниченные права на удаление.
Проводите тестовое восстановление
Периодическая проверка должна подтвердить, что архив открывается, база импортируется, файлы не повреждены, необходимые пароли доступны, а сайт запускается и выполняет критичные функции. Только после такого теста резервную копию можно считать рабочей.
12. Настройте журналы, мониторинг и уведомления
Без журналов невозможно понять, когда началась проблема, кто выполнил действие и какие данные могли быть затронуты.
Стоит фиксировать входы, изменение ролей, создание администраторов, критичные настройки, загрузку и удаление файлов, ошибки приложения, изменения интеграций, важные действия с заказами и платежами, системные события и результаты резервного копирования. При этом в журналы нельзя записывать пароли, полные токены, номера банковских карт и другие секретные данные.
Уведомления нужны при недоступности сайта, ошибке резервного копирования, нехватке места на диске, резком росте нагрузки, массовых неудачных входах, создании нового администратора, изменении DNS или критичных файлов.
Мониторинг должен проверять не только ответ главной страницы. Сайт может возвращать код 200, но не отправлять формы, не подключаться к базе или показывать ошибку авторизованным пользователям.
Проверяйте подрядчиков и внешние зависимости
Сайт зависит от плагинов, библиотек, сторонних JavaScript-скриптов, CRM, аналитики, платёжных сервисов, CDN, почтовых платформ и подрядчиков с административным доступом.
Перед подключением внешнего сервиса важно понять, какие данные он получает, какие права ему выдаются, где хранятся данные, как отозвать доступ и что произойдёт при его недоступности. Неиспользуемые токены, вебхуки, DNS-записи и интеграции следует удалять.
Подготовьте план реагирования
При взломе не должно начинаться обсуждение, кто знает пароль от сервера и где лежат резервные копии. В плане должны быть контакты ответственных, способ срочно ограничить доступ, расположение журналов, порядок сохранения данных для расследования, отзыв ключей, восстановление и правила уведомления руководства или клиентов.
План нужно периодически проверять. Инструкция с устаревшими аккаунтами и телефонами поддержки бесполезна.
Если признаки компрометации уже обнаружены, используйте отдельное руководство: «Как понять, что сайт взломали, и что делать в первые часы».
Обучайте сотрудников без формального подхода
Сотруднику не обязательно знать устройство SQL-инъекции. Но он должен понимать, почему нельзя передавать общий пароль, как распознать поддельную страницу входа, куда сообщать о подозрительном письме, что делать при потере телефона и почему инцидент нельзя скрывать до конца рабочего дня.
Короткая практическая инструкция обычно полезнее ежегодной презентации, которую никто не запомнил.
Нужен ли сайту WAF
Web Application Firewall может блокировать часть подозрительных запросов, ограничивать ботов и снижать нагрузку от массовых атак. Но он не заменяет исправление уязвимого кода, обновление CMS, проверку прав доступа, защиту аккаунтов, резервное копирование и мониторинг.
WAF — дополнительный уровень защиты, а не способ сделать небезопасное приложение безопасным.
Как часто проводить аудит безопасности
Проверка особенно нужна перед запуском нового проекта, после крупного обновления или смены сервера, при подключении оплаты и личного кабинета, после смены подрядчика, обнаружения уязвимости или инцидента.
Для постоянно развивающегося веб-сервиса безопасность должна быть частью разработки и проверки каждого значимого изменения, а не отдельным мероприятием раз в несколько лет.
Что владелец сайта может проверить за 30 минут
- Известно, на кого зарегистрирован домен и есть ли доступ к регистратору.
- На критичных аккаунтах включена MFA.
- У каждого специалиста собственная учётная запись, а старые доступы закрыты.
- CMS, плагины и сервер получают обновления.
- Неиспользуемые компоненты удалены.
- Резервные копии создаются автоматически и хранятся отдельно.
- Известна дата последнего тестового восстановления.
- Контролируются срок TLS-сертификата, доступность сайта и критичные ошибки.
- Секреты не хранятся в публичном репозитории.
- Известно, кому звонить при подозрении на взлом.
Если на большинство пунктов нет уверенного ответа, сайт может работать нормально, но бизнес не контролирует его безопасность и восстановление.
Вывод
Безопасность сайта не обеспечивается одним плагином, сертификатом или антивирусом. Это сочетание технических и организационных мер: понятной ответственности, учёта компонентов, регулярных обновлений, защищённых аккаунтов, минимальных прав, безопасной обработки данных, проверяемых резервных копий, мониторинга и плана реагирования.
Цель заключается не в создании иллюзии полной неуязвимости, а в управляемом снижении риска: затруднить атаку, быстро заметить проблему, ограничить ущерб и восстановить работу.
Официальные источники
- OWASP Top 10:2025
- OWASP Application Security Verification Standard
- OWASP Cheat Sheet Series
- NIST Cybersecurity Framework 2.0
- CISA Secure by Design
Не уверены, что сайт можно безопасно восстановить после атаки?
В noviKEY мы проверяем CMS, программный код, серверные настройки, доступы, резервное копирование и мониторинг. По результатам составляем приоритетный план: что исправить немедленно, а что можно улучшать поэтапно.