Сайт не защищён: что за этим стоит и что чинить в первую очередь
Разбираем, что скрывается за словами о незащищённом сайте: сертификат, доступы, обновления, бэкапы. Пять уровней защиты и порядок работ на неделю.
Содержание
- Три разные проблемы под одной фразой
- Уровень 1: сертификат, редирект и смешанный контент
- Уровень 2: пароли, двухфакторка и лишние администраторы
- Уровень 3: обновления, nulled-сборки и чужие скрипты
- Уровень 4: права на файлы, дампы в корне и xmlrpc
- Уровень 5: бэкап, который кто-то разворачивал
- Порядок работ: час, день, неделя
- Частые вопросы
- С чего начать прямо сейчас
Чаще всего «сайт не защищён» это надпись браузера про отсутствующий или просроченный SSL, и лечится она за 20 минут бесплатным сертификатом. Но той же фразой называют ещё четыре вещи: слабые доступы, устаревший код, дырявый сервер и отсутствие бэкапа. Проверить все пять уровней и закрыть найденное реально за неделю.
Статья для владельца сайта на WordPress, Битриксе или OpenCart, которому кто-то сказал, что с защитой беда. Внутри: как понять, о каком именно уровне речь, что проверить самому командой в терминале, что отдать администратору. Чего тут нет: инструкций по взлому и рекламы платных антивирусов для сайта.

Я веду абонентку шесть лет и получаю такую заявку примерно раз в две недели. В половине случаев проблема на первом уровне и решается в тот же день. В другой половине сертификат-то как раз в порядке, а вот пароль от админки лежит в переписке в мессенджере с 2021 года.
Три разные проблемы под одной фразой
Прежде чем что-то чинить, выясните, кто и по какому поводу произнёс слово «незащищённый». От этого зависит объём работ: от двадцати минут до двух недель.
Браузер ругается на соединение
В адресной строке зачёркнутый замок, надпись «Не защищено», а на форме входа всплывает предупреждение о передаче пароля открытым текстом. Это транспорт, первый уровень. Сайт при этом может быть абсолютно здоров внутри. Подробнее про сам механизм предупреждения я разбирал в статье про незащищённое соединение.
Пришёл список замечаний от сканера или подрядчика
Обычно это выгрузка из сканера: устаревшая версия CMS, открытый xmlrpc.php, отсутствие заголовков безопасности, права 777 на папке загрузок. Тут никакой аварии нет, есть список слабых мест разной степени вредности. Половину пунктов сканеры завышают, но игнорировать список целиком не стоит.
Сайт уже взломан
Появились чужие страницы, поисковик показывает в выдаче ссылки на казино, хостинг прислал письмо о вредоносном коде, посетители жалуются на редиректы. Это не про защиту, это про лечение, и порядок действий там другой. Признаки заражения и первые шаги описаны отдельно, в материале про признаки взлома.
Уровни ниже идут по возрастанию цены ошибки: первый видит каждый посетитель, пятый не видит никто, пока не станет поздно.
| Уровень | Что проверяем | Чем | Сколько занимает |
|---|---|---|---|
| 1. Транспорт | сертификат, редирект, смешанный контент | браузер, curl, openssl | 20 минут — 2 часа |
| 2. Доступы | пароли, двухфакторка, список админов, FTP | панель хостинга, wp-cli | 1-3 часа |
| 3. Код | версии ядра и плагинов, nulled, чужие скрипты | wp-cli, grep | 2-6 часов |
| 4. Сервер | права на файлы, дампы в корне, xmlrpc, PHP | ssh, curl | 2-4 часа |
| 5. Восстановление | бэкап вне хостинга, проверенное восстановление | скрипт, тестовый домен | 3-8 часов |
Уровень 1: сертификат, редирект и смешанный контент
Самый заметный и самый дешёвый в починке. Сертификат Let’s Encrypt бесплатный, выпускается из панели хостинга в два клика и обновляется автоматически каждые 90 дней. Платный DV начинается примерно от 800 рублей в год и по факту даёт ровно то же шифрование, разница только в бумажке и страховке.
Сначала посмотрите, что вообще отдаёт сервер.
# срок действия сертификата
echo | openssl s_client -connect example.ru:443 -servername example.ru 2>/dev/null
| openssl x509 -noout -dates -subject
# есть ли редирект с http на https
curl -sI http://example.ru/ | head -3
# отвечает ли сайт по https без ошибок
curl -sI https://example.ru/ | head -1
Три типичных исхода. Сертификата нет вообще, тогда выпускаем. Сертификат есть, но истёк: автопродление обычно отваливается после переезда на другой хостинг, и полгода никто этого не замечает. Сертификат живой, но сайт всё равно открывается по http, потому что редирект никто не настроил.
Редирект на Apache делается четырьмя строками в .htaccess в корне сайта:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Дальше самая занудная часть: смешанный контент. Сертификат выпущен, редирект стоит, а замок всё равно перечёркнут, потому что внутри страниц остались ссылки на картинки и скрипты по http. В WordPress это лечится одной командой, но обязательно с бэкапом базы под рукой:
wp search-replace 'http://example.ru' 'https://example.ru' --precise --report-changed-only --dry-run
Сначала с --dry-run, смотрим отчёт, потом без него. Отдельно проверьте виджеты, счётчики и подключённые шрифты: они часто прописаны в настройках темы, а не в контенте. Подробный разбор в статье про смешанный контент.
Уровень 2: пароли, двухфакторка и лишние администраторы
Здесь я нахожу больше всего проблем, и здесь их дешевле всего закрыть. Ни один сканер безопасности не покажет, что пароль от админки знают семь человек, из которых двое уже не работают в компании.
Начните с инвентаризации администраторов. В WordPress:
wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
Смотрите на даты регистрации. Учётка, созданная в три часа ночи в выходной, с почтой на несуществующем домене, это не забытый подрядчик, это чужой вход. В Битриксе то же самое ищется в разделе Настройки, Пользователи, фильтр по группе Администраторы, плюс журнал событий за последний месяц.
Что закрываю в первый заход:
- Удаляю или понижаю до подписчика всех, кто не работает с сайтом прямо сейчас.
- Меняю пароли на генерируемые, 20 символов и больше, каждому свой. Общий пароль на всех означает, что при уходе любого сотрудника менять придётся всё.
- Включаю двухфакторную аутентификацию хотя бы владельцу и себе.
- Развожу FTP-аккаунты: один общий доступ на всех подрядчиков это классика, из-за которой потом невозможно понять, чьим ключом залили шелл.
- Ставлю ограничение попыток входа. Без него боты перебирают админку круглосуточно и заодно едят процессорное время на shared-хостинге.
Отдельная боль: пароли в переписке. Если доступ от хостинга лежит в чате мессенджера, он уже не секрет, потому что историю чата читает любой, кто получит телефон сотрудника. Менеджер паролей стоит от нуля до 300 рублей в месяц и закрывает вопрос навсегда.
Уровень 3: обновления, nulled-сборки и чужие скрипты
Во взломанные сайты, которые я разбирал, чаще всего заходили через старый плагин с известной уязвимостью. Пароль подбирают реже: это дольше и заметнее. Эксплойт публикуют, боты сканируют интернет пачками и находят тех, кто не поставил обновление.
Обновления на своих клиентах я ставлю раз в две недели. Реже уже рискованно: между выходом патча и массовым сканированием проходит несколько дней.
wp core check-update
wp plugin list --update=available --format=table
wp theme list --update=available --format=table
wp core verify-checksums
Последняя команда сравнивает файлы ядра с эталоном на wordpress.org и показывает изменённые. Любое расхождение в ядре это либо кривое обновление, либо закладка.
Отдельно смотрю на три места, которые сканеры обычно не подсвечивают.
Плагины, которые блокируют обновления. Установленный disable-wordpress-updates или подобный обычно означает, что кто-то однажды сломал сайт обновлением, испугался и выключил их совсем. Через год у вас ядро годовой давности и десяток дыр.
Nulled-сборки. Взломанная премиум-тема, скачанная с торрента, экономит 5 000 рублей на лицензии и приносит бэкдор в комплекте примерно в половине случаев. Ищу их поиском по сигнатурам:
grep -rlE "eval(|base64_decode(|gzinflate(|shell_exec(" wp-content/ --include="*.php"
find wp-content/uploads -name "*.php"
Второй командой ищем PHP в папке загрузок. Там его быть не должно вообще: картинки не исполняются. Любой найденный файл это повод остановиться и звать администратора.
Чужие скрипты в шапке. Счётчики, виджеты чатов и коды рекламных сетей, оставшиеся от прошлых подрядчиков, живут в теме годами. Каждый из них это внешний JavaScript с полным доступом к вашей странице, включая формы. Проверьте, что каждый подключённый домен вы узнаёте.
Уровень 4: права на файлы, дампы в корне и xmlrpc
Тут находки менее очевидные, но именно они превращают мелкую дырку в полноценный доступ.
Права на файлы. Рабочая схема: 644 на файлы, 755 на папки, wp-config.php можно ужать до 640. Права 777 на папке загрузок ставят, когда не могут разобраться, почему не грузятся картинки, и забывают снять. Это приглашение записать туда что угодно.
find . -type f -perm 0777
find . -type d -perm 0777
Открытые дампы и бэкапы в корне. Самая обидная утечка из всех, что я видел: файл dump.sql в корне сайта отдаётся по прямой ссылке любому, кто угадал имя, а внутри пароли к базе и хеши всех пользователей. Проверяю так, займёт минуту:
for f in dump.sql backup.sql base.sql wp-config.php.bak .env db.zip site.tar.gz; do
printf "%-22s " "$f"
curl -s -o /dev/null -w "%{http_code}n" "https://example.ru/$f"
done
Всё, что ответило 200, убираем с публичного доступа сегодня же. Удалять молча не надо, это чьи-то бэкапы: перенесите их выше docroot или в закрытое хранилище.
Листинг каталогов. Если при заходе на /wp-content/uploads/2026/03/ открывается список файлов, добавьте Options -Indexes в .htaccess.
XML-RPC. Файл xmlrpc.php в WordPress нужен для приложений и Jetpack, а используется в основном ботами: через него удобно перебирать пароли пачками по несколько сотен за запрос. Если приложениями вы не пользуетесь, его закрывают на уровне веб-сервера.
Версия PHP. На PHP 7.4 сегодня не выходит обновлений безопасности с 2022 года. Переезд на 8.2 или 8.3 в панели хостинга занимает пять минут, но требует проверки сайта после переключения: старые плагины иногда падают.
Уровень 5: бэкап, который кто-то разворачивал
Считайте, что рано или поздно сайт всё равно ляжет. Причина не обязательно в дырке: хостинг роняет диск, сотрудник заливает в базу мусор, подрядчик сносит не ту папку. Защита без плана восстановления это половина работы.
Что должно быть у любого коммерческого сайта:
- Бэкап вне хостинга. Копия, которая лежит на том же сервере, при заражении шифровальщиком или блокировке аккаунта пропадает вместе с сайтом. Объектное хранилище стоит порядка 30-60 рублей в месяц за 10 ГБ.
- Хотя бы одна копия за 30 дней назад. Заражение часто замечают через две-три недели, и суточная копия к этому моменту уже заражена.
- Проверенное восстановление. Бэкап, который никто не разворачивал, это файл неизвестного содержания. Раз в квартал разверните его на тестовом поддомене и убедитесь, что сайт поднимается. Как это делается, я расписал в статье про проверку бэкапа восстановлением.
Записанный контакт хостинга и регистратора туда же. В момент аварии выяснять, на кого оформлен домен, поздно.
Порядок работ: час, день, неделя
Всё сразу делать не нужно и не получится. Разбиваю так.
| Когда | Что делаем | Результат |
|---|---|---|
| Первый час | выпустить или продлить сертификат, включить редирект на https | замок в браузере, надпись про незащищённость исчезла |
| Первый день | сменить пароли, удалить лишних админов, включить 2FA, закрыть открытые дампы | чужой в админку и в базу больше не заходит |
| Первая неделя | обновить ядро и плагины, снять 777, поднять PHP, настроить бэкап вне хостинга и проверить его | точка входа закрыта, есть куда откатиться |
Чек-лист, по которому я принимаю работу:
- [ ]
https://открывается без предупреждений, замок целый. - [ ]
http://отдаёт 301 наhttps://, а не 200. - [ ] Смешанного контента нет ни на одной шаблонной странице.
- [ ] В списке администраторов только те, кого вы можете назвать по имени.
- [ ] Двухфакторка включена минимум у владельца.
- [ ] Ядро и плагины обновлены,
verify-checksumsмолчит. - [ ] PHP не ниже 8.2.
- [ ] В корне и в uploads нет
.sql,.zipи.php, которых там быть не должно. - [ ] Бэкап уезжает на внешнее хранилище по расписанию.
- [ ] Восстановление из бэкапа проверено, дата проверки записана.
Разовый аудит по этому списку с отчётом стоит в районе 8 000-12 000 рублей и занимает у меня один рабочий день. Чистка уже заражённого сайта дороже: 15 000-30 000 рублей и от одного до трёх дней работы, в зависимости от того, сколько файлов задето и есть ли чистый бэкап. Разница в цене и есть главный аргумент за аудит до аварии.
Частые вопросы
Сколько стоит убрать надпись «сайт не защищён» в браузере?
Сертификат Let’s Encrypt бесплатный, включается из панели хостинга и обновляется сам каждые 90 дней. Работа занимает 20 минут вместе с настройкой редиректа на https. Если после выпуска остался смешанный контент, добавьте ещё час-два на замену ссылок в базе и в настройках темы. Платный сертификат для обычного сайта не нужен.
Можно ли обойтись бесплатным сертификатом или надо покупать?
Для обычного сайта услуг или визитки бесплатного Let’s Encrypt достаточно: шифрование там точно такое же, как в платном DV за 800 рублей в год. Платный имеет смысл, если нужна страховка от удостоверяющего центра, поддержка по телефону или сертификат с проверкой организации для интернет-магазина с оплатой на сайте.
Что делать, если сайт уже взломали?
Порядок другой: сначала снять копию заражённого сайта для разбора, потом сменить все пароли и соли, затем искать закладки и точку входа. Одного удаления найденных файлов мало, дыра обычно остаётся в устаревшем плагине. Если чистого бэкапа за 30 дней нет, чистка займёт от одного до трёх дней.
Как часто нужно проверять защиту сайта?
Обновления ядра и плагинов я ставлю раз в две недели, список администраторов и открытые файлы проверяю раз в квартал, восстановление из бэкапа тестирую тоже раз в квартал. Полный прогон по всем пяти уровням достаточно делать раз в год или сразу после смены подрядчика, когда меняются все доступы.
С чего начать прямо сейчас
Откройте свой сайт по адресу http:// без буквы s и посмотрите, куда он вас перекинет. Если остался на http, у вас проблема первого уровня и её видно каждому посетителю. Дальше загляните в список администраторов и посчитайте, скольких из них вы знаете лично.
Если по этим двум пунктам всё в порядке, вы уже лучше половины сайтов малого бизнеса, которые ко мне попадают. Если нет, дальше по списку из таблицы выше.
Разбирать все пять уровней самому не обязательно. Аудит с отчётом и приоритетами делаю за один день, регулярные обновления и бэкапы входят в абонентку, условия и цены на странице тарифов. Если ситуация горит прямо сейчас, например хостинг уже прислал письмо про вредоносный код, напишите мне с описанием и доступом к панели, разберусь в тот же день.