Як захистити сайт на WordPress від злому: повний гайд з безпеки
Привіт:) У цьому пості покажу як захистити сайт на WordPress від злому. Нижче на конкретних прикладах продемонструю способи та методи, які використовую у своїй практиці для клієнтських сайтів.
- Зміна стандартної адреси сторінки входу в адмін-панель WordPress
- Приховування версії WordPress
- Навіщо потрібно приховувати версію WordPress
- Вимкнення X-Pingback та XML-RPC
- Переваги вимкнення X-Pingback та XML-RPC
- Недоліки вимкнення X-Pingback та XML-RPC
- Як вимкнути X-Pingback та XML-RPC
- Закриття доступу до основних файлів WordPress
- Заборона авторизації через Email
- Вимкнення можливості редагування файлів в адмін-частині для тем та плагінів
- Заборона виконання PHP-файлів у директорії завантажень
- Захист від ботів
- Заборона перегляду файлів readme.html та license.txt
- Боротьба зі СПАМом у Contact Form 7
- Активація антивірусу та брандмауера на хостингу
- Створення резервних копій
- Двофакторна автентифікація (2FA)
- Встановлення плагіну для комплексного захисту
Зміна стандартної адреси сторінки входу в адмін-панель WordPress
За замовчуванням у WordPress використовується одна і та ж URL-адреса для входу в адмін-панель. На цій сторінці розміщена форма для введення логіну та паролю. Зловмисники, маючи доступ до неї, запустити процес підбору даних для входу. В результаті — повний доступ до керування сайтом. Один із способів вирішення цієї проблеми — змінити цю адресу, яку знатиме лише власник сайту.
до змісту ↑Приховування версії WordPress
За замовчуванням WordPress додає в HTML-код сторінок рядок із версією CMS:
<meta name="generator" content="WordPress x.x.x" />
А також версія присутня в інших місцях сайту (наприклад, у RSS-стрічках).
Навіщо потрібно приховувати версію WordPress
- Захист від автоматичних сканерів. Хакери та боти масово сканують інтернет у пошуках сайтів із застарілими версіями 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 у соцмережі через сторонні сервіси, вони також можуть вимагати цей протокол.
Код нижче також прибирає наступні рядки із 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
- У файлі 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] );
}
- У кореневому каталозі сайту у файлі .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
СПАМ через форми — це не лише набридливі листи у вашій пошті. Це інструмент, який хакери використовують для розвідки, зламу та експлуатації вашого сервера.
Ось головні загрози СПАМу через форми для безпеки сайту.
- Впровадження вірусів (Ін'єкції)
Форма — це вхідні двері. Якщо вони не захищені, боти замість тексту "заносять" шкідливий код (SQL-ін'єкції або XSS). Це дозволяє хакерам викрасти паролі адміністратора або видалити базу даних.
- Блокування вашого сервера (Blacklisting)
Коли боти зламують поштову форму, ваш сайт починає розсилати тисячі СПАМ-листів іншим. Наслідок — поштові сервіси (Gmail, Outlook) заносять ваш домен у "чорні списки". Ваші реальні листи клієнтам більше ніколи не дійдуть.
- DDoS та падіння сайту
Масова атака тисяч ботів на одну форму створює величезне навантаження на сервер. Сайт починає гальмувати або взагалі "падає", стаючи недоступним для людей.
- Знищення SEO-рейтингу
Боти можуть публікувати через форми посилання на небезпечні ресурси (віруси, казино). Google бачить це, позначає ваш сайт як "шкідливий" і викидає його з пошуку.
Є декілька способів захистити форми, створені за допомогою популярного плагіну Contact Form 7.
до змісту ↑Активація антивірусу та брандмауера на хостингу
Зазвичай на хостингу, де розміщується ваш сайт, є функціонал для захисту. Наприклад, захист сторінки для входу в адмін-частину, антивірус та брандмауер. Якщо ці інструменти не задіюються автоматично для працюючого сайту, рекомендую їх активувати через адмін-панель хостингу.
Створення резервних копій
Рекомендую періодично (хоча би раз на тиждень) створювати резервні копії бази даних та файлів сайту. Якщо сайт перестане працювати, завжди можна буде відновити його робочу версію.
Двофакторна автентифікація (2FA)
Додає додатковий рівень безпеки до процесу входу в WordPress, вимагаючи від користувачів введення другого засобу автентифікації на додаток до пароля. Це допомагає захиститися від несанкціонованого доступу навіть у разі витоку паролів.
Для цього існує плагін Two Factor від розробників WordPress.
Встановлення плагіну для комплексного захисту
Серед WordPress-плагінів є такі, які надають комплексний захист сайту.
- Wordfence Security — популярне рішення, що включає в себе брандмауер, сканування на шкідливе програмне забезпечення (антивірус), контроль змін у файлах ядра WordPress, безпеку входу в адмін-частину (двофакторна автентифікація (2FA), CAPTCHA на сторінці входу).
