Як захистити сайт на WordPress від злому: повний гайд з безпеки

Привіт:) У цьому пості покажу як захистити сайт на WordPress від злому. Нижче на конкретних прикладах продемонструю способи та методи, які використовую у своїй практиці для клієнтських сайтів.

Зміна стандартної адреси сторінки входу в адмін-панель WordPress

За замовчуванням у WordPress використовується одна і та ж URL-адреса для входу в адмін-панель. На цій сторінці розміщена форма для введення логіну та паролю. Зловмисники, маючи доступ до неї, запустити процес підбору даних для входу. В результаті — повний доступ до керування сайтом. Один із способів вирішення цієї проблеми — змінити цю адресу, яку знатиме лише власник сайту.

до змісту ↑

Приховування версії WordPress

За замовчуванням WordPress додає в HTML-код сторінок рядок із версією CMS:

<meta name="generator" content="WordPress x.x.x" />

А також версія присутня в інших місцях сайту (наприклад, у RSS-стрічках).

  • Захист від автоматичних сканерів. Хакери та боти масово сканують інтернет у пошуках сайтів із застарілими версіями WordPress. Якщо вони "бачать", що на сайті встановлена версія, у якій є відома вразливість, такий сайт стає ціллю №1. Приховання версії не дасть ботам простого приводу для атаки.
  • Приховування відсутності оновлень. Якщо з якихось причин WordPress не оновився до останньої версії, ті ж самі хакери та боти цього не помітять.
  • Чистота коду. Видалення ще одного зайвого рядка, який не несе користі звичайному відвідувачу.
/**
 * Hide WordPress version
 * https://petrov.net.ua/wordpress-security-guide/
 */
add_filter( 'the_generator', '__return_empty_string' );
remove_action( 'wp_head', 'wp_generator' );
до змісту ↑

Вимкнення X-Pingback та XML-RPC

XML-RPC — це протокол, який дозволяє керувати сайтом віддалено (наприклад, через мобільний додаток WordPress або сторонні сервіси).

Pingback — це автоматичне сповіщення, яке приходить вам, коли хтось посилається на вашу статтю.

Переваги вимкнення X-Pingback та XML-RPC

  • Захист від Bruteforce-атак. Хакери використовують метод system.multicall для підбору сотні паролів за один запит. Це набагато ефективніше для них, ніж підбір через звичайну сторінку логіну. Кращий спосіб — блокування цього методу.
  • Захист від DDoS-атак. Функцію pingback.ping часто використовують для масових атак на інші сайти, роблячи ваш сервер частиною ботнету.
  • Приховування технічної інформації. Видалення заголовка Server (у функції mp_remove_x_pingback_headers) заважає ботам дізнатися версію вашого ПЗ.
  • Економія ресурсів. Кожен запит до xmlrpc.php навантажує базу даних та процесор. Вимкнення непотрібних методів задіює менше ресурсів сервера хостинга.
до змісту ↑

Недоліки вимкнення X-Pingback та XML-RPC

  • Мобільний додаток WordPress. Якщо ви користуєтеся офіційним мобільним додатком для публікації статей, він може перестати працювати, оскільки використовує XML-RPC.
  • Jetpack. Цей популярний плагін вимагає XML-RPC для зв'язку з серверами WordPress.com. Якщо у вас стоїть Jetpack, цей код його "зламає".
  • Інтеграції (IFTTT, Zapier). Якщо ви автоматично репостете статті з WordPress у соцмережі через сторонні сервіси, вони також можуть вимагати цей протокол.
У сучасному вебі для віддаленого керування сайтом використовується безпечніший REST API, а застарілий XML-RPC залишається лише як вхідні двері для ботів.

Код нижче також прибирає наступні рядки із HTML-коду сторінок сайту:

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://site.com/xmlrpc.php?rsd" />
<link rel="pingback" href="https://site.com/xmlrpc.php">

А також закриває доступ до файлу https://site.com/xmlrpc.php.

до змісту ↑

Як вимкнути X-Pingback та XML-RPC

  1. У файлі functions.php додайте код:
/**
 * Disable X-Pingback and XML-RPC
 * https://petrov.net.ua/wordpress-security-guide/
 */
add_filter( 'wp_headers', 'mp_remove_pingback_header' );
add_filter( 'template_redirect', 'mp_remove_x_pingback_headers' );
add_filter( 'xmlrpc_methods', 'mp_block_xmlrpc_attacks' );
add_action( 'pre_ping', 'mp_disable_pingback' );
add_filter( 'pre_update_option_enable_xmlrpc', '__return_false' );
add_filter( 'pre_option_enable_xmlrpc', '__return_zero' );
// Disabling the ability to publish via xmlrpc.php
add_filter( 'xmlrpc_enabled','__return_false' );
// Disable X-Pingback HTTP Header. 
function mp_remove_pingback_header( $headers ) {
	unset( $headers['X-Pingback'] );
	return $headers;
}
function mp_remove_x_pingback_headers( $headers ) {
    if ( function_exists( 'header_remove' ) ) {
        header_remove( 'X-Pingback' );
        header_remove( 'Server' );
	}
}
function mp_block_xmlrpc_attacks( $methods ) {
	unset( $methods['system.multicall'] );
    unset( $methods['system.listMethods'] );
    unset( $methods['system.getCapabilities'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    unset( $methods['pingback.ping'] );
    unset( $methods['wp.getUsersBlogs'] );
	
	return $methods;
}
function mp_disable_pingback( &$links ) {
    foreach ( $links as $l => $link )
    if ( 0 === strpos( $link, get_option( 'home' ) ) )
    unset( $links[$l] );
}
  1. У кореневому каталозі сайту у файлі .htaccess додайте рядки:
# Denying all requests on /xmlrpc.php
<files xmlrpc.php>
  Order allow,deny
  Deny from all
</files>
до змісту ↑

Закриття доступу до основних файлів WordPress

У кореневому каталозі сайту у файлі .htaccess додайте

# Denying all requests on wp-config.php
<files wp-config.php>
  order allow,deny
  deny from all
</Files>

# Denying all requests on .htaccess
<files .htaccess>
  order allow,deny
  deny from all
</files>

# Denying all requests on /readme.html, license.txt
<FilesMatch "^(readme\.txt|readme\.html|license\.txt)$">
  Order allow,deny
  Deny from all
</FilesMatch>

Заборона авторизації через Email

/**
 * Disable Login by Email in WordPress
 * https://petrov.net.ua/wordpress-security-guide/
 */
remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );

Вимкнення можливості редагування файлів в адмін-частині для тем та плагінів

/**
 * Disable the ability to edit files in the admin panel for themes and plugins
 */
define( 'DISALLOW_FILE_EDIT', true );

Заборона виконання PHP-файлів у директорії завантажень

У каталозі /wp-content/uploads/ створіть файл .htaccess та розмістіть у ньому наступний код:

<Files ~ "\.(php)$">
  Order allow,deny
  Deny from all
</Files>

Захист від ботів

У кореневому каталозі сайту у файлі .htaccess додайте рядки

# Block spambots
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  # RewriteCond %{HTTP_USER_AGENT} ^(chatgpt|chatgpt-user|oai-searchbot|ccbot) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(aesop_com_spiderman|alexibot|backweb|bandit|batchftp|bigfoot) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(black.?hole|blackwidow|blowfish|botalot|buddy|builtbottough|bullseye) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(cheesebot|cherrypicker|chinaclaw|collector|copier|copyrightcheck) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(cosmos|crescent|curl|custo|da|diibot|disco|dittospyder|dragonfly) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(drip|easydl|ebingbong|ecatch|eirgrabber|emailcollector|emailsiphon) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(emailwolf|erocrawler|exabot|eyenetie|filehound|flashget|flunky) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(frontpage|getright|getweb|go.?zilla|go-ahead-got-it|gotit|grabnet) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(grafula|harvest|hloader|hmview|httplib|httrack|humanlinks|ilsebot) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(infonavirobot|infotekies|intelliseek|interget|iria|jennybot|jetcar) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(joc|justview|jyxobot|kenjin|keyword|larbin|leechftp|lexibot|lftp|libweb) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(likse|linkscan|linkwalker|lnspiderguy|lwp|magnet|mag-net|markwatch) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(mata.?hari|memo|microsoft.?url|midown.?tool|miixpc|mirror|missigua) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(mister.?pix|moget|mozilla.?newt|nameprotect|navroad|backdoorbot|nearsite) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(net.?vampire|netants|netcraft|netmechanic|netspider|nextgensearchbot) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(attach|nicerspro|nimblecrawler|npbot|octopus|offline.?explorer) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(offline.?navigator|openfind|outfoxbot|pagegrabber|papa|pavuk) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(pcbrowser|php.?version.?tracker|pockey|propowerbot|prowebwalker) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(psbot|pump|queryn|recorder|realdownload|reaper|reget|true_robot) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(repomonkey|rma|internetseer|sitesnagger|siphon|slysearch|smartdownload) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(snake|snapbot|snoopy|sogou|spacebison|spankbot|spanner|sqworm|superbot) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(superhttp|surfbot|asterias|suzuran|szukacz|takeout|teleport) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(telesoft|the.?intraformant|thenomad|tighttwatbot|titan|urldispatcher) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(turingos|turnitinbot|urly.?warning|vacuum|vci|voideye|whacker) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^(libwww-perl|widow|wisenutbot|wwwoffle|xaldon|xenu|zeus|zyborg|anonymouse) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^web(zip|emaile|enhancer|fetch|go.?is|auto|bandit|clip|copier|master|reaper|sauger|site.?quester|whack) [NC,OR]
  RewriteCond %{HTTP_USER_AGENT} ^.*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures).*$ [NC]
  RewriteRule . - [F,L]
</IfModule>
до змісту ↑

Заборона перегляду файлів readme.html та license.txt

Обидва файли розміщуються у кореневому каталозі WordPress-сайту.

Додайте у файл .htaccess, який знаходиться у кореневому каталозі сайту, наступний код:

# Denying all requests on /readme.html, license.txt
<FilesMatch "^(readme\.txt|readme\.html|license\.txt)$">
  Order allow,deny
  Deny from all
</FilesMatch>

Боротьба зі СПАМом у Contact Form 7

СПАМ через форми — це не лише набридливі листи у вашій пошті. Це інструмент, який хакери використовують для розвідки, зламу та експлуатації вашого сервера.

Ось головні загрози СПАМу через форми для безпеки сайту.

  1. Впровадження вірусів (Ін'єкції)

Форма — це вхідні двері. Якщо вони не захищені, боти замість тексту "заносять" шкідливий код (SQL-ін'єкції або XSS). Це дозволяє хакерам викрасти паролі адміністратора або видалити базу даних.

  1. Блокування вашого сервера (Blacklisting)

Коли боти зламують поштову форму, ваш сайт починає розсилати тисячі СПАМ-листів іншим. Наслідок — поштові сервіси (Gmail, Outlook) заносять ваш домен у "чорні списки". Ваші реальні листи клієнтам більше ніколи не дійдуть.

  1. DDoS та падіння сайту

Масова атака тисяч ботів на одну форму створює величезне навантаження на сервер. Сайт починає гальмувати або взагалі "падає", стаючи недоступним для людей.

  1. Знищення SEO-рейтингу

Боти можуть публікувати через форми посилання на небезпечні ресурси (віруси, казино). Google бачить це, позначає ваш сайт як "шкідливий" і викидає його з пошуку.

Є декілька способів захистити форми, створені за допомогою популярного плагіну Contact Form 7.

до змісту ↑

Активація антивірусу та брандмауера на хостингу

Зазвичай на хостингу, де розміщується ваш сайт, є функціонал для захисту. Наприклад, захист сторінки для входу в адмін-частину, антивірус та брандмауер. Якщо ці інструменти не задіюються автоматично для працюючого сайту, рекомендую їх активувати через адмін-панель хостингу.

Створення резервних копій

Рекомендую періодично (хоча би раз на тиждень) створювати резервні копії бази даних та файлів сайту. Якщо сайт перестане працювати, завжди можна буде відновити його робочу версію.

Двофакторна автентифікація (2FA)

Додає додатковий рівень безпеки до процесу входу в WordPress, вимагаючи від користувачів введення другого засобу автентифікації на додаток до пароля. Це допомагає захиститися від несанкціонованого доступу навіть у разі витоку паролів.

Для цього існує плагін Two Factor від розробників WordPress.

Встановлення плагіну для комплексного захисту

Серед WordPress-плагінів є такі, які надають комплексний захист сайту.

  • Wordfence Security — популярне рішення, що включає в себе брандмауер, сканування на шкідливе програмне забезпечення (антивірус), контроль змін у файлах ядра WordPress, безпеку входу в адмін-частину (двофакторна автентифікація (2FA), CAPTCHA на сторінці входу).
Михайло Петров
Михайло Петров

Мене звати Михайло. Я — WordPress-розробник. Створюю візитки, корпоративні сайти, інтернет-магазини, блоги на WordPress. Надаю консультації з WordPress.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *