WordPress по умолчанию не ограничивает выполнение PHP-скриптов в директориях, которые не предназначены для этого. Это создает потенциальную уязвимость: при загрузке вредоносного файла в такие папки злоумышленник может выполнить его напрямую. Защита от этого – закрытие определённых директорий от исполнения PHP через настройки веб-сервера или файл .htaccess.
wp-content/uploads – основная папка для загрузки файлов пользователями. В ней не должно быть исполняемого PHP-кода. Запрет выполнения здесь критичен. Добавьте в wp-content/uploads/.htaccess строку php_flag engine off
или используйте правило RemoveHandler .php
, если сервер работает под Apache.
wp-includes – содержит системные библиотеки. Эти файлы не должны вызываться напрямую. В .htaccess можно закрыть доступ к ним с помощью директивы <FilesMatch "\.php$"> Deny from all </FilesMatch>
, либо использовать Nginx-правила, ограничивающие доступ ко всем PHP-файлам, кроме тех, что запускаются через index.php.
wp-content/themes и wp-content/plugins требуют более тонкой настройки. Эти директории содержат исполняемый код, но можно ограничить выполнение PHP в подкаталогах, не предполагающих его использование – например, в директориях assets, images, css, js. Здесь можно применять аналогичные правила блокировки, исключая поддиректории, необходимые для работы темы или плагина.
Блокировка выполнения PHP вне целевых точек входа снижает риск эксплуатации уязвимостей загрузки. Правильная конфигурация .htaccess или Nginx – базовая мера защиты WordPress от внедрения и запуска вредоносных скриптов.
Зачем блокировать выполнение PHP в wp-content/uploads
Каталог wp-content/uploads
предназначен исключительно для хранения загружаемых пользователями файлов: изображений, видео, документов. WordPress не предусматривает размещение в этой папке исполняемого кода. Однако при уязвимостях в плагинах или темах злоумышленники могут загрузить в неё вредоносные PHP-скрипты и запускать их напрямую, получая доступ к серверу или данным сайта.
Примеры атак включают:
- Обход аутентификации через создание backdoor-скриптов;
- Фишинговые страницы под видом изображений или PDF-файлов;
- Внедрение веб-шеллов для удалённого выполнения команд на сервере.
Чтобы исключить выполнение PHP в uploads
, достаточно создать файл .htaccess
с директивой:
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
На Nginx эквивалентная настройка в блоке location
может выглядеть так:
location ~* ^/wp-content/uploads/.*\.php$ {
deny all;
}
Эта мера не мешает загрузке и отображению медиафайлов, но полностью исключает запуск PHP-скриптов из этой директории, эффективно нейтрализуя целый класс атак.
Как обезопасить wp-includes от запуска вредоносного кода
Каталог wp-includes содержит ядро WordPress, и выполнение PHP-файлов напрямую из него недопустимо. Для ограничения выполнения скриптов в этом каталоге необходимо настроить серверное окружение.
Если используется Apache, добавьте в файл .htaccess, расположенный в корне сайта, следующие директивы:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^wp-includes/.*\.php$ - [F,L]
</IfModule>
Эта конфигурация запрещает выполнение любых PHP-файлов внутри wp-includes, кроме тех, к которым обращается ядро через include или require.
Для Nginx используйте следующий блок в конфигурации виртуального хоста:
location ~* ^/wp-includes/.*\.php$ {
deny all;
}
Убедитесь, что права на каталог wp-includes установлены как 755, а на файлы – 644. Это предотвращает несанкционированную запись и запуск новых скриптов.
Также рекомендуется настроить мониторинг изменений файлов в wp-includes. Любое появление новых PHP-файлов – сигнал к немедленному анализу на вредоносный код.
Ограничение PHP в папках кеширования и логов
Папки, предназначенные для хранения кеша и логов, не должны содержать исполняемые PHP-файлы. Их основная функция – хранение временных данных, а не обработка запросов. Оставление возможности выполнения PHP-кода в этих директориях создает критическую уязвимость: злоумышленник может загрузить вредоносный скрипт и выполнить его напрямую.
Наиболее распространённые директории, требующие ограничения: wp-content/cache, wp-content/uploads/cache, wp-content/wflogs (используется плагином Wordfence), wp-content/uploads/wpo-plugins-tables-list и аналогичные. В некоторых конфигурациях также следует проверить наличие debug.log и других лог-файлов в wp-content.
Чтобы исключить возможность выполнения PHP-кода, в корень каждой целевой папки добавьте файл .htaccess со следующим содержимым:
<FilesMatch "\.php$">
Deny from all
</FilesMatch>
Альтернатива для серверов Nginx – настройка location в конфигурации:
location ~* ^/wp-content/(cache|wflogs)/.*\.php$ {
deny all;
}
Также рекомендуется установить на эти папки права доступа 750 или 770, чтобы ограничить доступ другим пользователям на сервере. Убедитесь, что веб-сервер не имеет прав на выполнение файлов в этих директориях.
Регулярно проверяйте содержимое указанных папок. Если обнаружены PHP-файлы, которых не должно быть, это потенциальный признак компрометации.
Нужно ли запрещать выполнение PHP в wp-content/languages
Каталог wp-content/languages предназначен исключительно для хранения языковых файлов WordPress и плагинов. Эти файлы имеют расширения .mo, .po и .json, и не требуют выполнения как PHP-код. Любое наличие исполняемых скриптов в этой папке указывает на потенциальную компрометацию сайта.
Запрещать выполнение PHP в wp-content/languages необходимо по соображениям безопасности. Хакеры часто используют этот каталог для загрузки вредоносных PHP-файлов, рассчитывая на то, что он считается «безопасным» и редко проверяется. При успешной загрузке PHP-оболочки в этот каталог злоумышленник получает возможность выполнять произвольный код на сервере.
Для защиты сайта создайте файл .htaccess с содержимым:
<FilesMatch "\.php$"> Deny from all </FilesMatch>
Если сервер работает на Nginx, добавьте в конфигурацию блок:
location ~* ^/wp-content/languages/.*\.php$ { deny all; }
После внедрения запрета проверьте, не нарушена ли функциональность переводов. WordPress и плагины продолжают корректно загружать языковые файлы, так как они не выполняются как скрипты. Ограничение выполнения PHP в wp-content/languages является безопасной и рекомендуемой практикой для снижения рисков компрометации.
Настройка .htaccess для блокировки PHP в указанных папках
Для повышения безопасности WordPress необходимо предотвратить выполнение PHP-скриптов в уязвимых директориях, не предназначенных для запуска кода. К таким папкам относятся:
- /wp-content/uploads/
- /wp-includes/
- /wp-content/cache/
- /wp-content/backups/
В каждой из этих директорий следует создать файл .htaccess
со следующим содержимым:
<FilesMatch "\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
Этот код блокирует запуск любых .php-файлов, загруженных в данную папку, даже если они доступны по URL. Исключения не допускаются, все PHP-файлы будут недоступны для выполнения.
Если сервер использует Apache 2.4 и выше, рекомендуется применять обновлённый синтаксис:
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Для внедрения правил:
- Перейдите в целевую папку на сервере.
- Создайте файл
.htaccess
, если он отсутствует. - Вставьте соответствующий блок кода.
- Сохраните изменения и проверьте доступ к файлу с расширением .php – должно быть возвращено сообщение об ошибке 403.
Не добавляйте эти правила в корневой .htaccess
– они действуют только в пределах текущей директории. Настройка должна быть выполнена отдельно в каждой защищаемой папке.
Альтернативы .htaccess: использование настроек nginx
В отличие от Apache, который использует файл .htaccess для управления доступом и настройками, nginx не поддерживает такой механизм. Для конфигурации nginx используется один главный файл — nginx.conf, который позволяет настраивать обработку запросов и защиту папок. Чтобы закрыть доступ к выполнению PHP в определённых директориях, можно использовать различные директивы в конфигурации nginx.
Для защиты папок WordPress от выполнения PHP, достаточно использовать директиву `location`. Например, чтобы заблокировать доступ к PHP-скриптам в директории `wp-content/uploads`, нужно добавить следующее в блок `server` или `location` в конфигурационном файле nginx:
location ~ ^/wp-content/uploads/.*\.php$ { deny all; return 403; }
Этот код предотвратит выполнение PHP-файлов в директории `uploads`, возвращая код ошибки 403 (Forbidden) при попытке обращения к таким файлам. Также можно использовать директиву `try_files` для более гибкой настройки маршрутизации запросов:
location /wp-content/uploads/ { try_files $uri $uri/ =404; }
В этом примере nginx будет проверять наличие файла в указанной директории и возвращать ошибку 404, если файл не существует, но исключит возможность выполнения PHP-скриптов.
Для улучшения безопасности можно настроить ограничение доступа к определённым папкам с помощью директивы `allow` и `deny`. Например, если нужно ограничить доступ к директории `wp-includes` только для определённых IP-адресов, можно использовать следующую конфигурацию:
location ^~ /wp-includes/ { deny all; allow 192.168.1.1; }
Эта конфигурация запрещает доступ ко всем файлам в директории, за исключением IP-адреса 192.168.1.1.
Также стоит помнить, что nginx обрабатывает конфигурацию на уровне сервера и не предоставляет функциональности для динамического редактирования настроек, как это делает .htaccess в Apache. Поэтому все изменения в конфигурации nginx требуют перезагрузки сервера с помощью команды:
sudo systemctl reload nginx
Таким образом, настройка nginx для защиты от выполнения PHP в WordPress требует точных и тщательно настроенных правил, однако она обеспечивает более высокую производительность по сравнению с .htaccess в Apache.
Вопрос-ответ:
Какие папки в WordPress нужно закрывать от выполнения PHP?
В WordPress есть несколько папок, которые рекомендуется закрывать от выполнения PHP для повышения безопасности сайта. Это, в первую очередь, папки, содержащие административные или системные файлы, такие как wp-content, wp-includes и wp-admin. Закрытие доступа к этим папкам предотвращает запуск произвольных PHP-скриптов, что может снизить риск взлома сайта. Особенно важно ограничить доступ к папкам с плагинами и темами, чтобы предотвратить возможность выполнения вредоносных кодов через пользовательские файлы.
Какие риски могут возникнуть, если не закрывать папки WordPress от выполнения PHP?
Если папки WordPress не защищены от выполнения PHP, существует риск того, что злоумышленники смогут загрузить на сервер вредоносные скрипты или модифицировать существующие файлы. В результате этого можно потерять контроль над сайтом, данные пользователей могут быть украдены, а сам сайт может быть использован для распространения вирусов или спама. Закрытие папок от выполнения PHP значительно снижает такие риски, ограничивая возможности для атак.
Как узнать, что на сайте WordPress есть уязвимости из-за незакрытых папок от PHP?
Для проверки уязвимостей из-за незакрытых папок можно использовать различные инструменты для анализа безопасности, такие как сканеры уязвимостей или плагины безопасности для WordPress. Они могут выявить открытые PHP-файлы, которые доступны для выполнения. Также стоит внимательно следить за логами сервера и анализировать необычную активность, которая может свидетельствовать о попытках атак.
Может ли закрытие папок от PHP повлиять на работу плагинов или тем в WordPress?
Да, закрытие папок от выполнения PHP может повлиять на работу некоторых плагинов или тем в WordPress. Некоторые плагины могут требовать выполнения PHP-скриптов внутри папок, которые вы решите закрыть. Поэтому перед блокировкой выполнения PHP важно тщательно протестировать сайт на локальном сервере или создать резервную копию, чтобы предотвратить возможные проблемы. Если возникнут сбои, стоит адаптировать правила доступа для определённых папок, чтобы они не мешали функционированию критически важных компонентов.