Использование проверки на ABSPATH для предотвращения прямого доступа к PHP-файлам

Всё началось с того, что один подписчик из комментериев попросил меня оценить сайты, которые он делал, и в момент, когда я хотел через исходный код открыть файл style.css темы, я случайно открыл папку с темой, т.е. обратился напрямую к index.php.

В итоге вот что у меня открылось:

попытка обратиться к файлу темы 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, к которым должен быть разрешён доступ напрямую (обработчики форм, вебхуки).

Ну и что делать то в итоге?

Для начала, если вам интересна история с разработкой плагинов и тем для WordPress, то могу порекомендовать мой курс по разработке темы и курс по разработке плагина!

Да в общем можно ничего не делать, главное не забывайте отключать WP_DEBUG после разработки. Ну и конечно, если это не обычный файл темы, который начинается с get_header(), убедитесь, что в файле нет ввода/вывода, который можно использовать при взломе, иначе проверка на ABSPATH обязательна!

Я проанализировал несколько самых популярных сайтов на WordPress и нашёл все три подхода!

  • CSS Tricks и WP Tavern – не делают ничего (файлы темы выдают ошибку 500),
  • WP Beginner – вероятно блокируют файлы при помощи файла .htaccess (получаем ответ Forbidden).
  • WP Explorer – используют константу ABSPATH (получаем пустой белый экран без ошибки – результат действия функции die).

Источник: Блог Миши Рудрастых

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: