WordPress: Call to undefined function get_header()
Не так давно, решил слать себе письма обо всех ошибках, которые периодически возникают в разных проектах. Где-то это просто не критические предупреждения (php notice-ы), бывает где-то что-то внезапно падает, а бывает что и роботы или спаммеры пытаются найти уязвимости.. Все проблемы стараюсь исправлять в максимально короткие сроки, чтобы всё содержать в полном порядке..
Не так давно начали сыпаться подобные ошибки, с сайтов на WordPress-е:
Msg: mod_fcgid: stderr: PHP Fatal error: Call to undefined function get_header() in /www/site.com/wp-content/themes/twentyten/404.php on line 10
Для тех, кто впервые столкнулся с такой ошибкой, поясню: тут говорится что интерпретатор не нашел объявления функции get_header(), которая вызывается в файле 404.php в 10 строке.
Честно сказать, я несколько недель не мог вкурить почему это происходит, ведь get_header - это стандартная встроенная функция WP и её не может не быть при нормальной работе.. Ошибки были одиночные, но время от времени повторялись..
Увидев эту ошибку сегодня в очередном отчете, я понял почему они появляются и разумеется нашел способ это исправить. Именно об этом и пойдет речь.
Начнем с того, почему они появляются: атакующий (или бот) вызывает файл php напрямую, а не через вызов index.php, который и должен подгружать все остальные функции.
Т.е. вместо: http://site.com/something
Он переходит сюда: http://site.com/wp-content/themes/twentyten/404.php
Дальше файл 404.php выполняется, в нем запрашивается функция get_header(), которая не объявлена ранее и дальше происходит ошибка.
По моему мнению, делают это аттакующие боты, которые ищут изветные уязвимости в темах. В случае, если у Вас свежая тема, то проблем быть не должно, но за всем не уследишь. В особенности, это становится трудно делать когда у тебя десятки или даже сотни сайтов Именно этим и промышляют злоумышленники.
Теперь, когда ясна причина, давайте разберем способы защиты:
Способ 1. Можно создать файл .htaccess в директории темы, и в нем запретить доступ к файлам php
Создаем файл: www/wp-content/themes/название-вашей-темы/.htaccess
Добавляем содержимое:
1 2 3 4 5 |
<FilesMatch "\.php$"> Require all denied </FilesMatch> |
Данный способ будет удобен тем, у кого установлена собственная тема. Т.е. она не будет сама обновляться и созданный файл останется целым после обновления. В моем случае стоит стандартная тема, т.к. что вариант не подходит.
Способ 2. Можно в файле www/.htaccess запретить доступ к файлам php проверяя url
Открываем в редакторе файл: www/.htaccess
Добавляем в самое начало следующее:
1 2 3 |
RedirectMatch 404 /wp-content/themes/[^/]+/.+\.php$ |
Этим мы проверяем все url на совпадение с заданным путем, и в случае такового редиректим на страницу 404.
Этот способ удобен тем, что внедряется не в папку темы и не влияет на неё. После обновления темы по прежнему будет защищать указанный путь.
Способ 3. Если Вы разработчик тем, тогда самы правильный способ следующий:
Во все php файлы тем, нужно добавить проверку на запуск через единую точку входа, например так:
1 2 3 4 5 |
<?php if (!defined( ‘ABSPATH’ )) die("Access denied"); |
Этот способ наиболее правильный, однако если разработчик темы не Вы, тогда при первом же обновлении темы, данные изменения пропадут. Ну, а если разработчик, тогда этот способ самый правильный, т.к. этот он не зависит от веб-сервера и будет так же прекрасно работать, как на nginx так и на apache.
Вот такими нехитрыми способами, Вы избавитесь от ошибок в логах и обезопасите свой сайт.
Author: | Tags: /
| Rating:
5 comments.
Write a comment