Керування файлами cookie, які використовуються для реклами, таких як персоналізація реклами, ремаркетинг і аналіз ефективності реклами.
2.14.1.17. Захист від злому сайту на WordPress
Увага!
Перед виконанням будь-яких дій створіть резервні копії сайту та бази даних.- Регулярно оновлюйте WordPress, теми та плагіни. Наразі частка CMS WordPress перевищує 30% усіх веб-сайтів у світі. Через величезну поширеність WordPress є популярною метою для хакерів. Оскільки WordPress — це CMS з відкритим вихідним кодом, будь-хто може отримати доступ до коду, щоб дізнатися і покращити його. Однак це також означає, що хакери можуть вивчити його і знайти способи проникнути на веб-сайти.
Щоразу, коли виявляється вразливість, розробники WordPress докладають усіх зусиль, щоб випустити оновлення, яке усуває проблему. Якщо ви не використовуєте останню версію WordPress, ви використовуєте програмне забезпечення з відомими вразливостями безпеки. - Видаліть усі невикористовувані теми з директорії
wp-content/themesі невикористовувані плагіни з директоріїwp-content/plugins. Зберігання безкоштовних тем і плагінів у рази збільшує ймовірність злому сайту. Якщо тема або плагін неактивні, вони все одно дають змогу відкривати шкідливі скрипти з каталогуwp-content/themes/ім'я_темиабоwp-content/plugins/ім'я_плагіна. - Більше половини безкоштовних тем WordPress заражені або вразливі. Якщо ви завантажуєте преміум-теми з ресурсу, де вони розміщені безкоштовно, з великою ймовірністю вони містять шкідливий код або спам-посилання.
- Вимкніть відображення версії Wordpress. Зловмисники не дізнаються версію, а отже, не знатимуть і вразливі місця. Для цього відкрийте файл
wp-content/themes/ім'я_теми/functions.phpі додайте після першого рядка наступний код:function remove_wordpress_version_number() { return ''; } add_filter('the_generator', 'remove_wordpress_version_number'); function remove_version_from_scripts( $src ) { if ( strpos( $src, '?ver=' ) ) $src = remove_query_arg( 'ver', $src ); return $src; } add_filter( 'style_loader_src', 'remove_version_from_scripts'); add_filter( 'script_loader_src', 'remove_version_from_scripts'); - Перемістіть конфігураційний файл
wp-config.phpна директорію вище поточної. Файлwp-config.phpмістить основні налаштування вашого сайту, і це найважливіший файл у кореневому каталозі сайту. У поточній архітектурі WordPress файл конфігурації перевіряється з найвищим пріоритетом. Таким чином, навіть якщо він зберігається в одній папці вище кореневого каталогу, WordPress все ще зможе його бачити. Вам потрібно перемістити цей файл із каталогу/home/ім'я_хостинг_акаунта/ім'я_сайту/www/у каталог/home/ім'я_хостинг_акаунта/ім'я_сайту/. Увага! Ця рекомендація може бути застосована тільки в разі використання одного піддомену. - Змініть префікс бази даних. Зробити це можна за допомогою phpMyAdmin:
- Скопіюйте отриманий список усіх таблиць у базі та для кожної таблиці створіть подібний запит:
RENAME TABLE `wp_comments` TO `wpnew1_comments`; - Виконайте створені запити:

- Щоб переконатися, що префікс
wp_більше не використовується, виконайте запит:SELECT * FROM `wpnew1_options` WHERE `option_name` LIKE '%wp_%' - Вручну змініть префікс на новий, використовуючи кнопку «Змінити»:

- Виконайте такі самі дії після виконання наступного запиту:
SELECT * FROM `wpnew1_usermeta` WHERE `meta_key` LIKE '%wp_%' - Останнім кроком відкрийте конфігураційний файл
wp-config.phpі змініть префікс на новий:
- Змініть стандартний логін адміністратора
admin:- Відкрийте її та знайдіть у колонці
user_loginлогінadmin. Натисніть «Змінити», впишіть новий логін адміністратора і збережіть зміни:
- Змініть URL адмін-панелі. Для цього використовуйте плагін Protect Your Admin:
- Встановіть плагін, відкрийте меню плагіна, замініть URL і натисніть «Save»:

- У розділі «Налаштування → Постійні посилання» встановіть опцію «Назва запису»:
Тепер адмін-панель буде доступна за адресою вигляду example.com/wpmyadmin.
- Заборонити доступ до файлу
xmlrpc.php. Для цього в кореневому каталозі сайту в файл.htaccessдодайте один з варіантів обмеження:# Редирект на локальну адресу. У логу буде код відповіді 301. RewriteRule ^xmlrpc\.php$ "http\:\/\/127\.0\.0\.1\/" [R=301,L] # Забороняємо доступ до файлу. У логу буде код відповіді 403. RewriteRule ^xmlrpc.php$ - [F,L] - Вимкніть виконання PHP-файлів у директорії завантажень. Це поширене місце для завантаження вірусів. Щоб запобігти виконанню шкідливого коду в разі злому, додайте в файл
wp-content/uploads/.htaccessнаступний код:<Files ~ "\.(php)$"> Order allow,deny Deny from all </Files> - Обмежте доступ по IP до адмін-панелі. Ця рекомендація підходить для тих, у кого статична IP-адреса. В файлі
.htaccessу кореневому каталозі сайту додайте наступний код:RewriteEngine on RewriteCond %{REQUEST_URI} ^(.*)?wp-admin$ [OR] RewriteCond %{REQUEST_URI} ^(.*)?wp-login\.php(.*)$ RewriteCond %{REMOTE_ADDR} !^127.0.0.1$ RewriteRule ^(.*)$ - [R=403,L]Замість
127.0.0.1впишіть вашу IP-адресу. - Невеликий файрвол для сайту. Ці правила можуть уповільнити роботу сайту, оскільки кожен запит, що надходить на сайт, буде аналізуватися за їх допомогою. Якщо ви помітите істотне зниження швидкості роботи сайту, не слід використовувати ці правила. Замість цього спробуйте скористатися плагіном Wordfence Security — Firewall & Malware Scan.
Додайте код файрвола в файл.htaccessу кореневому каталозі сайту:<IfModule mod_rewrite.c> RewriteEngine On # Блокування XSS RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] # Блокуємо виставлення змінної PHP GLOBALS через URL RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] # Блокуємо можливість змінювати змінну _REQUEST через URL RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) # Блокування MySQL-ін'єкцій, RFI, base64 тощо. RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR] RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR] RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR] RewriteCond %{QUERY_STRING} ftp\: [NC,OR] RewriteCond %{QUERY_STRING} http\: [NC,OR] RewriteCond %{QUERY_STRING} https\: [NC,OR] RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR] RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR] RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR] RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR] RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR] RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR] RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR] RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR] RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR] RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR] RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR] RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR] RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR] RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR] RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR] RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR] RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR] RewriteCond %{QUERY_STRING} (sp_executesql) [NC] RewriteCond %{QUERY_STRING} (eval\() [NC,OR] RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR] RewriteRule ^(.*)$ - [F,L] # Блокування відомих Shell RewriteEngine on RewriteCond %{REQUEST_URI} .*((php|my)?shell|remview.*|phpremoteview.*|sshphp.*|pcom|nstview.*|c99|r57|webadmin.*|phpget.*|phpwriter.*|fileditor.*|locus7.*|storm7.*).(p?s?x?htm?l?|txt|aspx?|cfml?|cgi|pl|php[3-9]{0,1}|jsp?|sql|xml) [NC,OR] RewriteCond %{REQUEST_METHOD} (GET|POST) [NC] RewriteCond %{QUERY_STRING} ^(.*)=(/|%2F)(h|%68|%48)(o|%6F|%4F)(m|%6D|%4D)(e|%65|%45)(.+)?(/|%2F)(.*)(/|%2F)(.*)$ [OR] RewriteCond %{QUERY_STRING} ^work_dir=.*$ [OR] RewriteCond %{QUERY_STRING} ^command=.*&output.*$ [OR] RewriteCond %{QUERY_STRING} ^nts_[a-z0-9_]{0,10}=.*$ [OR] RewriteCond %{QUERY_STRING} ^c=(t|setup|codes)$ [OR] RewriteCond %{QUERY_STRING} ^act=((about|cmd|selfremove|chbd|trojan|backc|massbrowsersploit|exploits|grablogins|upload.*)|((chmod|f)&f=.*))$ [OR] RewriteCond %{QUERY_STRING} ^act=(ls|search|fsbuff|encoder|tools|processes|ftpquickbrute|security|sql|eval|update|feedback|cmd|gofile|mkfile)&d=.*$ [OR] RewriteCond %{QUERY_STRING} ^&?c=(l?v?i?&d=|v&fnot=|setup&ref=|l&r=|d&d=|tree&d|t&d=|e&d=|i&d=|codes|md5crack).*$ [OR] RewriteCond %{QUERY_STRING} ^(.*)([-_a-z]{1,15})=(chmod|chdir|mkdir|rmdir|clear|whoami|uname|unzip|gzip|gunzip|grep|more|umask|telnet|ssh|ftp|head|tail|which|mkmode|touch|logname|edit_file|search_text|find_text|php_eval|download_file|ftp_file_down|ftp_file_up|ftp_brute|mail_file|mysql|mysql_dump|db_query)([^a-zA-Z0-9].+)*$ [OR] RewriteCond %{QUERY_STRING} ^(.*)(wget|shell_exec|passthru|system|exec|popen|proc_open)(.*)$ RewriteRule .* - [F] </IfModule>
(5)

