WordPress — найпопулярніша CMS і найбільш атакована. 40% зломів відбуваються через застарілі плагіни. Цей чекліст закриває 95% загроз.
1. Оновлення — перший пріоритет
- WordPress core — оновлюйте негайно
- Плагіни й теми — щотижня
- Видаліть невикористовувані плагіни та теми
- Увімкніть автооновлення безпеки: Dashboard → Updates → Enable auto-updates
2. Захист wp-admin
# У .htaccess обмежити доступ до wp-admin за IP:
<Directory /var/www/site/wp-admin>
Order deny,allow
Deny from all
Allow from ВАШ_IP
</Directory>
- Змініть URL входу: плагін WPS Hide Login
- Увімкніть двофакторку: плагін WP 2FA
- Обмежте спроби входу: Limit Login Attempts Reloaded
3. wp-config.php — посилення
// Унікальні секретні ключі (генерація: https://api.wordpress.org/secret-key/1.1/salt/)
define('AUTH_KEY', 'унікальний_рядок');
// Заборонити редагування файлів з адмінки:
define('DISALLOW_FILE_EDIT', true);
// Обмежити ревізії:
define('WP_POST_REVISIONS', 5);
// Заборонити зовнішні HTTP-запити (якщо не потрібні):
// define('WP_HTTP_BLOCK_EXTERNAL', true);
4. Плагін безпеки
Встановіть один із:
- Wordfence — файрвол + сканер малварі + блокування IP
- Sucuri Security — моніторинг цілісності файлів
- iThemes Security — комплексний захист
5. Права на файли
find /var/www/wordpress -type f -exec chmod 644 {} \;
find /var/www/wordpress -type d -exec chmod 755 {} \;
chmod 600 wp-config.php
Типові помилки та що вони означають
| Повідомлення | Причина | Що робити |
|---|---|---|
| Too many login attempts, please try again later | Плагін обмеження спроб входу заблокував вашу IP-адресу після кількох невірних паролів | Зачекайте тайм-аут (зазвичай 15–60 хвилин) або зніміть блокування в налаштуваннях плагіна |
| This site may be hacked (у Google Search Console) | Google знайшов на сайті шкідливий редирект, спам-контент або впроваджений скрипт | Проскануйте файли, видаліть чужий код, запросіть повторну перевірку в Search Console |
| There has been a critical error on this website | Конфлікт плагіна безпеки з темою або іншим плагіном, частіше після оновлення | Увімкніть WP_DEBUG, знайдіть винуватця в debug.log, вимкніть його через FTP або SSH |
| Invalid command 'RewriteEngine', perhaps misspelled | Правило з плагіна безпеки потрапило до .htaccess, але модуль mod_rewrite в Apache вимкнено | Увімкніть модуль: a2enmod rewrite && systemctl restart apache2 |
| 403 Forbidden під час спроби зайти за старою адресою /wp-admin/ | Це очікувана поведінка плагіна зміни URL входу, а не помилка | Використовуйте нову адресу входу, вказану в налаштуваннях WPS Hide Login |
Порівняння плагінів безпеки
| Плагін | Файрвол | Сканер малварі | Ціна Pro-версії |
|---|---|---|---|
| Wordfence | Так, на рівні PHP до завантаження WordPress | Так, база сигнатур оновлюється щодня | $119/рік за сайт |
| Sucuri Security | Хмарний WAF, окрема платна послуга | Так, плюс моніторинг цілісності файлів | $199/рік за сайт |
| iThemes Security | Базові правила рівня плагіна | Обмежений, без бази сигнатур | $99/рік за один сайт |
Коли чекліста не вистачає
Чекліст закриває типові загрози, але є ситуації, де потрібні додаткові заходи:
- Вразливість у власному коді теми або плагіна, написаного на замовлення, — потрібен аудит вихідного коду, а не готовий плагін безпеки
- Зараження через сусідній сайт на тому самому shared-хостингу (cross-site contamination) — допомагає лише ізоляція акаунта або перехід на VDS
- «Nulled»-версії платних плагінів і тем з безкоштовних форумів — у них часто вже вбудований бекдор ще до встановлення
- Компрометація облікового запису хостингу, FTP або панелі реєстратора домену — WordPress тут ні до чого, а сайт все одно виявиться зламаним
Якщо сайт уже скомпрометовано, цей чекліст не допоможе його вилікувати — спочатку потрібна діагностика й очищення, як описано у статті «Злом сайту: діагностика, очищення та відновлення». Загальний чекліст безпеки сервера, на якому стоїть WordPress, — у статті «Безпека WordPress: повний чекліст захисту сайту».
Перевірка результату
Після застосування чекліста переконайтеся, що захист справді працює:
# Чи вимкнено редагування файлів з адмінки
wp eval 'var_dump(defined("DISALLOW_FILE_EDIT") && DISALLOW_FILE_EDIT);'
# Права на wp-config.php мають бути 600 або 640, не 644
stat -c "%a %n" wp-config.php
# Стара адреса входу має віддавати 404, а не форму логіну
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/wp-admin/
# Активні плагіни безпеки через WP-CLI
wp plugin list --status=active | grep -i "wordfence\|sucuri\|ithemes"
Додатково поставте fail2ban перед сервером — він банить IP-адреси за логами Nginx/Apache ще до того, як запит дійде до WordPress.