Злоумышленники часто атакуют WordPress через открытые каталоги. Рассказываем, как закрыть доступ к папкам wp-content и wp-includes на уровне сервера (VPS) и защитить сайт от взлома.
Введение
Сайт на WordPress можно сравнить с домом, где есть комнаты (папки) для важных вещей, но двери туда по умолчанию открыты. Этим не прочь воспользоваться злоумышленники. Они заходят в такие папки, прячут там бомбу из вредоносного кода и со временем получают контроль над всем сайтом. Чтобы не допустить такого сценария, нужно закрыть эти двери, а именно ограничить доступ к ключевым каталогам WordPress через конфигурацию сервера.
В статье объяснили, зачем ограничивать доступ к папкам wp-content и wp-includes через настройки веб-сервера и как это сделать на практике.
Почему wp-content и wp-includes нужно защищать
Прежде чем переходить к настройкам, стоит разобраться, почему вообще необходимо ограничивать доступ к этим каталогам. Дело в том, что папка wp-content хранит весь пользовательский контент сайта, а в wp-includes находятся важные системные скрипты WordPress. Обычным посетителям незачем напрямую открывать файлы в этих директориях, однако по умолчанию веб-сервер не запрещает подобные обращения. Зная прямой URL, можно попробовать загрузить практически любой файл из wp-content или wp-includes.
На практике это создаёт серьёзные уязвимости. Например, злоумышленник может загрузить вредоносный PHP-скрипт в каталог wp-content/uploads, куда вы сами добавляете изображения и документы, а затем выполнить его через браузер, если выполнение PHP там не запрещено. Также некоторые плагины и темы содержат PHP-файлы, рассчитанные на работу только внутри WordPress и не защищённые от прямого запуска. Зная путь к такому файлу, атакующий способен открыть его вне контекста WordPress и выполнить свой код. Скрипты ядра в папке wp-includes тоже не предназначены для самостоятельного запуска из браузера. Прямое обращение к ним может вызвать ошибки в работе сайта или предоставить хакеру лазейку для взлома, особенно если обнаружится уязвимость в коде.
Правильные права доступа к файлам и папкам WordPress
Прежде всего убедитесь, что на сервере выставлены корректные права на файлы и каталоги WordPress. На большинстве хостингов эти настройки уже есть, но проверка не помешает:
- Папки: 755. Все директории, включая wp-content и wp-includes, должны иметь права 755. Это значит, что владелец может читать, писать и выполнять, а остальные пользователи и веб-сервер только читать содержимое. Иначе говоря, папка доступна для чтения всем, но изменять её содержимое можете только вы.
- Файлы: 644. Большинство файлов WordPress, такие как скрипты, страницы, медиа, должны иметь права 644. Владелец может читать и изменять, остальные только читать. Например, файлы ядра, темы и плагинов обычно настроены именно так. Исключение — конфигурационный файл wp-config.php, которому для безопасности выставляют 600 или 640, запрещая чтение и выполнение кому-либо, кроме владельца.
Никогда не устанавливайте права 777 на файлы или папки, этим вы открываете их для полного доступа любому пользователю, что крайне опасно. Если сейчас у каких-то элементов WordPress стоят 777, срочно поменяйте их на рекомендуемые значения. Сделать это можно через FTP-клиент или менеджер файлов хостинга. Каталоги wp-content и wp-includes должны иметь права 755, файлы внутри них — 644, а особо важный wp-config.php — 600 либо 640.
Но даже правильно настроенные права не мешают веб-серверу читать и выполнять PHP-скрипты. Даже если файл нельзя изменить, сервер всё равно выполнит его код при обращении.
Ограничение доступа для Apache
Самый простой способ закрыть нужные директории — воспользоваться файлом конфигурации Apache .htaccess. Он находится в корне вашего сайта. Если его нет, вы можете его создать. Перед началом обязательно сделайте резервную копию сайта, скачайте копию файлов WordPress и экспортируйте базу данных. Бекап поможет быстро восстановить работу, если вы допустите ошибку в правилах и сайт перестанет открываться.
Откройте файл .htaccess и добавьте в него правила безопасности после стандартного блока WordPress. Сначала запретите выполнение любых PHP-файлов внутри каталога wp-includes по прямому запросу:
# Защита wp-includes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php$ - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
Этот код запрещает любые прямые обращения к PHP-файлам внутри wp-includes. Флаг [F] означает Forbidden, доступ запрещён. Исключения сделаны для нескольких служебных путей, чтобы работа WordPress не нарушилась. В итоге если злоумышленник попробует открыть напрямую файл из wp-includes, сервер вернёт ошибку 403 вместо исполнения кода.
В каталоге wp-content нужно разрешить только доступ к статическим файлам, таким как изображения, стили, скрипты и так далее, запретив выполнение любых скриптов. Для этого можно создать отдельный .htaccess внутри папки wp-content, если его ещё нет, со следующим содержимым:
# Ограничение доступа в wp-content
Order deny,allow
Deny from all
<Files ~ "\.(xml|css|js|jpe?g|png|gif|svg|pdf|zip|rar)$">
Allow from all
</Files>
Сначала директива Deny from all закрывает доступ ко всем файлам в папке по умолчанию. Затем блок <Files ~ ...> открывает доступ только к перечисленным типам: изображениям, стилям, JS-скриптам, архивам и некоторым документам. При необходимости вы можете добавить другие расширения, которые используются на вашем сайте. Главное, что любые файлы вне списка, в том числе PHP, станут недоступны извне.
Такое ограничение теоретически может повлиять на работу некоторых плагинов или тем, если они пытаются обращаться к своим .php напрямую через URL, что случается редко. После внесения правил стоит проверить основные функции сайта. Если какой-то компонент перестал работать, изучите логи сервера. Возможно, ему нужен доступ к дополнительному типу файлов, и его стоит добавить в список исключений. В крайнем случае временно уберите правила для wp-content, но лучше по возможности отказаться от плагинов, которые требуют открытого доступа к своим PHP-файлам.
Каталог загрузок wp-content/uploads должен хранить только медиафайлы, поэтому выполнение скриптов PHP там не требуется. Если вы применили предыдущее правило для всего wp-content, загрузки уже защищены. Но не помешает добавить дополнительную защиту. Для этого создайте или откройте файл .htaccess в самой папке uploads и пропишите в нём:
<Files "*.php">
deny from all
</Files>
Эта короткая директива блокирует любой доступ к файлам .php внутри uploads. Даже если злоумышленнику удастся залить туда вредоносный скрипт, он не сможет его запустить, сервер вернёт отказ в доступе. Остальной контент продолжит открываться без ограничений.
Дополнительно рекомендуется запретить вывод списка файлов в директориях. Зачастую на сервере он выключен по умолчанию, но на всякий случай добавьте в .htaccess строчку:
Options -Indexes
После этого при прямом обращении к папке посетитель не увидит содержимое каталога, вместо этого будет показана ошибка или пустая страница. Это не прямое разграничение прав, но убирает лишнюю информацию о структуре сайта, которой могут воспользоваться злоумышленники.
Когда все правила добавлены, сохраните файл и протестируйте сайт. Зайдите на несколько страниц, убедитесь, что всё отображается правильно. Попробуйте открыть в браузере что-нибудь заведомо запрещённое, например, http://ваш-домен/wp-includes/version.php. Если вместо содержимого файла вы получили ошибку 403 или сообщение «Access denied», значит всё сделано правильно.
Ограничение доступа для Nginx
Многие хостинги сейчас используют веб-сервер Nginx либо в комбинации с Apache, либо отдельно. Учтите, что правила из .htaccess на Nginx не действуют, поэтому ограничения нужно включать в конфигурацию Nginx вручную. Например, можно добавить в блок server вашего сайта такие директивы:
location ~* ^/wp-includes/.*\.php$ {
deny all;
}
location ~* ^/wp-content/uploads/.*\.php$ {
deny all;
}
Эти правила запретят выполнение PHP-скриптов в указанных папках на уровне сервера. При этом обычные статические файлы продолжат раздаваться без ограничений. После изменения конфигурации не забудьте перезапустить Nginx. Если вы не уверены в своих силах, лучше проконсультироваться с администратором или технической поддержкой хостинга, поскольку неверные настройки Nginx могут привести к недоступности сайта.
Заключение
Как видите, настроить разграничение доступа к важным папкам WordPress вполне по силам даже начинающему администратору. Конечно, на этом нельзя останавливаться. Безопасность — это процесс, требующий регулярного внимания. Продолжайте своевременно обновлять WordPress, темы и плагины, делайте резервные копии и следите за подозрительной активностью. Зато теперь, когда ключевые папки надёжно под замком, вы можете гораздо спокойнее заниматься развитием проекта, зная, что ваш сайт защищён куда лучше прежнего.
Читайте в блоге:
- Как ускорить мобильную версию сайта WordPress
- Как автоматизировать настройку WordPress-сайтов в Nginx с помощью include
- Интеграция WordPress с Nginx и MariaDB на Ubuntu 24.04: от базы данных до SSL