2.14.1.17. Захист від злому сайту на WordPress

Увага!

Перед виконанням будь-яких дій створіть резервні копії сайту та бази даних.
  1. Регулярно оновлюйте WordPress, теми та плагіни. Наразі частка CMS WordPress перевищує 30% усіх веб-сайтів у світі. Через величезну поширеність WordPress є популярною метою для хакерів. Оскільки WordPress — це CMS з відкритим вихідним кодом, будь-хто може отримати доступ до коду, щоб дізнатися і покращити його. Однак це також означає, що хакери можуть вивчити його і знайти способи проникнути на веб-сайти.
    Щоразу, коли виявляється вразливість, розробники WordPress докладають усіх зусиль, щоб випустити оновлення, яке усуває проблему. Якщо ви не використовуєте останню версію WordPress, ви використовуєте програмне забезпечення з відомими вразливостями безпеки.
  2. Видаліть усі невикористовувані теми з директорії wp-content/themes і невикористовувані плагіни з директорії wp-content/plugins. Зберігання безкоштовних тем і плагінів у рази збільшує ймовірність злому сайту. Якщо тема або плагін неактивні, вони все одно дають змогу відкривати шкідливі скрипти з каталогу wp-content/themes/ім'я_теми або wp-content/plugins/ім'я_плагіна.
  3. Більше половини безкоштовних тем WordPress заражені або вразливі. Якщо ви завантажуєте преміум-теми з ресурсу, де вони розміщені безкоштовно, з великою ймовірністю вони містять шкідливий код або спам-посилання.
  4. Вимкніть відображення версії 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');
  5. Перемістіть конфігураційний файл wp-config.php на директорію вище поточної. Файл wp-config.php містить основні налаштування вашого сайту, і це найважливіший файл у кореневому каталозі сайту. У поточній архітектурі WordPress файл конфігурації перевіряється з найвищим пріоритетом. Таким чином, навіть якщо він зберігається в одній папці вище кореневого каталогу, WordPress все ще зможе його бачити. Вам потрібно перемістити цей файл із каталогу /home/ім'я_хостинг_акаунта/ім'я_сайту/www/ у каталог /home/ім'я_хостинг_акаунта/ім'я_сайту/. Увага! Ця рекомендація може бути застосована тільки в разі використання одного піддомену.
  6. Змініть префікс бази даних. Зробити це можна за допомогою phpMyAdmin:
    1. Скопіюйте отриманий список усіх таблиць у базі та для кожної таблиці створіть подібний запит:
      RENAME TABLE `wp_comments` TO `wpnew1_comments`;
    2. Виконайте створені запити:
    3. Щоб переконатися, що префікс wp_ більше не використовується, виконайте запит:
      SELECT * FROM `wpnew1_options` WHERE `option_name` LIKE '%wp_%'
    4. Вручну змініть префікс на новий, використовуючи кнопку «Змінити»:
    5. Виконайте такі самі дії після виконання наступного запиту:
      SELECT * FROM `wpnew1_usermeta` WHERE `meta_key` LIKE '%wp_%'
    6. Останнім кроком відкрийте конфігураційний файл wp-config.php і змініть префікс на новий:
  7. Змініть стандартний логін адміністратора admin:
    1. Увійдіть у phpMyAdmin, виберіть базу і знайдіть таблицю префікс_users:
    2. Відкрийте її та знайдіть у колонці user_login логін admin. Натисніть «Змінити», впишіть новий логін адміністратора і збережіть зміни:
    3. Змініть URL адмін-панелі. Для цього використовуйте плагін Protect Your Admin:
      1. Встановіть плагін, відкрийте меню плагіна, замініть URL і натисніть «Save»:
      2. У розділі «Налаштування → Постійні посилання» встановіть опцію «Назва запису»:Тепер адмін-панель буде доступна за адресою вигляду example.com/wpmyadmin.
  8. Заборонити доступ до файлу xmlrpc.php. Для цього в кореневому каталозі сайту в файл .htaccess додайте один з варіантів обмеження:
    # Редирект на локальну адресу. У логу буде код відповіді 301.
    RewriteRule ^xmlrpc\.php$ "http\:\/\/127\.0\.0\.1\/" [R=301,L]
    
    # Забороняємо доступ до файлу. У логу буде код відповіді 403.
    RewriteRule ^xmlrpc.php$ - [F,L]
  9. Вимкніть виконання PHP-файлів у директорії завантажень. Це поширене місце для завантаження вірусів. Щоб запобігти виконанню шкідливого коду в разі злому, додайте в файл wp-content/uploads/.htaccess наступний код:
    <Files ~ "\.(php)$">
      Order allow,deny
      Deny from all
    </Files>
  10. Обмежте доступ по 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-адресу.

  11. Невеликий файрвол для сайту. Ці правила можуть уповільнити роботу сайту, оскільки кожен запит, що надходить на сайт, буде аналізуватися за їх допомогою. Якщо ви помітите істотне зниження швидкості роботи сайту, не слід використовувати ці правила. Замість цього спробуйте скористатися плагіном 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)