Главная > Wordpress > WordPress: Call to undefined function get_header()

WordPress: Call to undefined function get_header()

22.05.2016 3 комментария » Просмотры: 1 693
 

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

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

<FilesMatch "\.php$">
Require all denied
</FilesMatch>

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

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

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

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

RedirectMatch 404 /wp-content/themes/[^/]+/.+\.php$

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

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

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

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

<?php 

if (!defined( ‘ABSPATH’ )) die("Access denied");

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

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

Автор: | Теги: , ,

Важно

У нас заработал ФОРУМ. Все вопросы, которые не касаются статьи, а так же вопросы по конкретно вашему случаю нужно задавать и обсуждать именно там, в разделе "Помощь пользователям".

3 комментария

Написать свой
  1. Василий Ответить
    24.10.2016 в 6:06 пп
    Здравствуйте! у меня такая проблема:
    Я скачал шаблон с сайта и нечего не менял, хотел проверить на локалке, перед тем чтобы залить на хостинг. Выходит вот такая ошибка:
    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
      Vitaliy Orlov Ответить
      24.10.2016 в 8:18 пп
      Думаю, тебе надо шаблон, поместить в директорию тем wordpress-а. Можешь почитать тут или поищи в Youtube или в гугле по запросу "Как установить тему Wordpress".
      • Василий Ответить
        29.10.2016 в 6:06 дп
        Спасибо большое! помогло

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Разрешены HTML-теги: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>