hosting:cms:wordpress:hack-protection

2.13.1.18. Защита от взлома сайта на 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 в корневом каталоге сайта:

    .htaccess.txt
    <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>
  • hosting/cms/wordpress/hack-protection.txt
  • Последние изменения: 2019/08/29 11:47
  • — karlov