Main > Wordpress > WordPress: Call to undefined function get_header()

WordPress: Call to undefined function get_header()

22.05.2016 5 comments » Views: 6,564

Wordpress ошибки

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

Добавляем содержимое:

Данный способ будет удобен тем, у кого установлена собственная тема. Т.е. она не будет сама обновляться и созданный файл останется целым после обновления. В моем случае стоит стандартная тема, т.к. что вариант не подходит.

Способ 2. Можно в файле www/.htaccess запретить доступ к файлам php проверяя url

Открываем в редакторе файл: www/.htaccess

Добавляем в самое начало следующее:

Этим мы проверяем все url на совпадение с заданным путем, и в случае такового редиректим на страницу 404.

Этот способ удобен тем, что внедряется не в папку темы и не влияет на неё. После обновления темы по прежнему будет защищать указанный путь.

Способ 3. Если Вы разработчик тем, тогда самы правильный способ следующий:

Во все php файлы тем, нужно добавить проверку на запуск через единую точку входа, например так:

Этот способ наиболее правильный, однако если разработчик темы не Вы, тогда при первом же обновлении темы, данные изменения пропадут. Ну, а если разработчик, тогда этот способ самый правильный, т.к. этот он не зависит от веб-сервера и будет так же прекрасно работать, как на nginx так и на apache.

Вот такими нехитрыми способами, Вы избавитесь от ошибок в логах и обезопасите свой сайт.

Author: | Rating: 4/5 | Tags: , ,

5 comments.

Write a comment
  1. Андрей Reply
    22.02.2017 в 10:24 pm
    Доброго времени суток. Разрабатываю тему свою презентационную тему. Простой интернет магазинчик витрина. Проблема с get_header началась, когда стал запускать session_start(); и записывать туда переменные чтоб извлечь их в "корзине" и там уже записать в базу данных и сформировать потовое отправление админу. На страничке конкретного товара запустил сессию а на странице корзина - такая коллизия. Это меня через session бьют ?
    • Vitaliy Orlov Reply
      23.02.2017 в 3:51 pm
      Всего скорее не из-за сессий. Проблема в том, что где-то вызывается get_header, до (или без) подключения wp-includes/general-template.php. Ищи то место, где именно происходит ошибка.
  2. Василий Reply
    24.10.2016 в 6:06 pm
    Здравствуйте! у меня такая проблема:
    Я скачал шаблон с сайта и нечего не менял, хотел проверить на локалке, перед тем чтобы залить на хостинг. Выходит вот такая ошибка:
    Fatal error: Uncaught Error: Call to undefined function get_header() in C:\xampp\htdocs\mysite.local\index.php:4 Stack trace: #0 {main} thrown in C:\xampp\htdocs\mysite.local\index.php on line 4

    И со всеми шаблонами такое происходит, именно ссылаясь на get_header, что мне делать?
    p.s.: Я не силен в PHP программировании, но хочется попробовать...
    • Vitaliy Orlov Reply
      24.10.2016 в 8:18 pm
      Думаю, тебе надо шаблон, поместить в директорию тем wordpress-а. Можешь почитать тут или поищи в Youtube или в гугле по запросу "Как установить тему Wordpress".
      • Василий Reply
        29.10.2016 в 6:06 am
        Спасибо большое! помогло

Leave a Reply

Your email address will not be published. Required fields are marked *

Allowed HTML-tags: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>