Всё началось с того, что один подписчик из комментериев попросил меня оценить сайты, которые он делал, и в момент, когда я хотел через исходный код открыть файл style.css
темы, я случайно открыл папку с темой, т.е. обратился напрямую к index.php
.
В итоге вот что у меня открылось:
Ну прежде всего, конечно, я бы отключил константу WP_DEBUG
в файле wp-config.php
. После этого, при попытке прямого доступа к файлу, так же на 1-й строчке будет выдаваться ошибка 500 и ничего дальше в целом происходить не будет. В целом практически все файлы тем WordPress содержат функции WordPress, поэтому вероятность того, что кто-то сможет навредить вашему сайту, не очень большая. Разве что боты переполнят ваши логи, открывая сотни раз файл с ошибкой 500.
Поэтому тут может быть две рекомендации, первая – в начале PHP-файлов темы и плагина поместите эти строчки:
if ( ! defined( 'ABSPATH' ) ) { die; }
Они означают, что если константа ABSPATH
не определена (она определяется в файле wp-config.php
), то значит файл был запущен за пределами среды WordPress, а значит ничего не делаем и выходим из файла функцией exit()
или die()
. По логике вещей вы можете добавить эти строчки в начало каждого .php файла темы или плагина, которую вы разрабатываете. Однако, если вы скачаете какую-то тему или плагин WordPress, то заметите, что на практике так никто не делает, обычно проверку на константу ABSPATH
мы находим только в тех .php
-файлах, которые содержат классы (да и то не всегда).
Другая рекомендация – это запретить выполнение файлов PHP внутри темы или плагина, добавив следующую группу правил в файл .htaccess
.
<Files *.php> Order Deny,Allow Deny from all </Files>
В таком случае будем получать ответ Forbidden
вместо ошибки 500. Тут важно быть осторожным, не содержит ли ваша тема каких-либо файлов PHP, к которым должен быть разрешён доступ напрямую (обработчики форм, вебхуки).
Ну и что делать то в итоге?
Да в общем можно ничего не делать, главное не забывайте отключать WP_DEBUG
после разработки. Ну и конечно, если это не обычный файл темы, который начинается с get_header(), убедитесь, что в файле нет ввода/вывода, который можно использовать при взломе, иначе проверка на ABSPATH
обязательна!
Я проанализировал несколько самых популярных сайтов на WordPress и нашёл все три подхода!