Articles

WordPress Error Fix: “Call to undefined function get_header()”

>♦ Posted by Jeff Starr in PHP, Security
January 11, 2019

Estou vendo um grande aumento nos ataques de bot visando diretamente arquivos de temas. Primeiro eles conseguem a URL para o seu diretório temático. Há inúmeras maneiras de um bot obter esta informação. Por exemplo, a maioria dos temas inclui ativos como arquivos CSS e JavaScript, e o link inclui a URL completa. Então, uma vez que eles tenham a URL do tema, maus bots farão pedidos diretos para arquivos de modelos de temas bem conhecidos, como index.php e header.php. Pedidos directos de ficheiros de templates podem revelar possíveis vulnerabilidades de segurança, o que aparentemente é um vector de ataque cada vez mais popular. Ele também aciona a função “Call to undefined function get_header()” (e similares) erros. Felizmente existe uma correção fácil.

É o seu site alvo?

Para descobrir se o seu site está sendo atingido com pedidos diretos de arquivos de temas, você pode verificar os logs de acesso/erro do seu site. Aqui estão alguns exemplos dos meus próprios logs que devem ajudar a mostrar o que procurar:

Nota: Nas seguintes entradas de logs, todos os caminhos de ficheiros são alterados para URLs de exemplo para evitar que o Google rastreie e reporte erros. Nos arquivos de log reais, os erros contêm caminhos de arquivo, não URLs. P.S., é mais ridículo que o Googlebot rastreie informações de caminhos de texto simples, dentro de <pre> tags não menos.
2018-12-30 17:54:07 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_header() in https://example.com/wp-content/themes/digwp/index.php:1Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/index.php on line 1'2018-12-30 12:53:55 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function get_header() in https://example.com/wp-content/themes/digwp/404.php:1Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/404.php on line 1'2018-12-30 12:53:55 ErrorAH01071: Got error 'PHP message: PHP Fatal error: Uncaught Error: Call to undefined function esc_url() in https://example.com/wp-content/themes/digwp/header.php:8Stack trace: #0 {main} thrown in https://example.com/wp-content/themes/digwp/header.php on line 8'

Então, se o seu site for alvo de ataques diretos, você verá MUITOS desses tipos de erros. Nestes exemplos, os pedidos são para index.php, 404.php, e header.php. A partir das minhas análises, a maioria das solicitações de modelos são para esses três arquivos, mas você também pode encontrá-los procurando por outros arquivos WordPress bem conhecidos, como:

/archive.php/wp-includes/rss-functions.php ..various theme template files..various files in the WP Media Library

Basicamente, qualquer solicitação direta para um núcleo, tema ou arquivo de plugin do WordPress muito provavelmente acionará um erro, a menos que medidas apropriadas sejam tomadas de antemão. Por exemplo, mais tarde veremos uma maneira fácil de parar o erro de “função indefinida”, que por sua vez ajudará a conservar preciosos recursos do servidor e melhorar a segurança geral do site.

Entendendo o erro

Então o que é o erro fatal “call to undefined function”? Eles acontecem porque o núcleo do WordPress não é carregado para arquivos de modelo carregados diretamente.

Por exemplo, se você solicitar header.php diretamente, quaisquer funções centrais como esc_url() não estão disponíveis porque o arquivo é solicitado fora do WordPress.

O que acontece se você não fizer nada? Bem, o seu tema pode já ter implementado uma técnica similar, ou talvez não. Qual é o risco? Dependendo de como seu tema é codificado, pode ser possível que maus atores executem código fora do contexto, o que pode expor potenciais vetores de ataque.

Como corrigir

A maneira mais fácil de evitar este tipo de erro é simplesmente sair do script se o WordPress não estiver disponível. Esta é uma antiga mas eficaz técnica PHP usada para prevenir o acesso direto a arquivos:

<?php if (!defined('ABSPATH')) exit; ?>

Diz simplesmente: Se a constante ABSPATH não está definida, então saia do script. Isto funciona porque ABSPATH só é definido quando o WordPress é carregado. Então quando um bot ruim aparecer e começar a solicitar seus templates temáticos, ele simplesmente receberá uma página em branco (resposta vazia) do servidor.

Você pode ter visto um código similar durante sua viagem pelo WordPress. Prevenir o acesso direto a scripts é uma parte importante da segurança do PHP. Você não quer atacantes/bots rodando scripts fora do contexto, quando não autorizados, e assim por diante.

Exemplo

Para implementar esta técnica, abra qualquer arquivo de tema que seja alvo, e inclua a linha no topo do arquivo. Por exemplo, muitos templates de temas incluem o cabeçalho antes de qualquer outro código, parece assim:

<?php get_header(); ?>

Após adicionar o trecho “sem acesso direto”, você terá algo como:

<?php if (!defined('ABSPATH')) exit;get_header(); ?>

No entanto você decide formatar o código está bem, o ponto é incluir a linha ABSPATH antes que qualquer outra função seja chamada.

Dica Pro: Quer parar mais bots ruins? Confira meu plugin gratuito para WordPress, Blackhole for Bad Bots, disponível no WP Plugin Directory.

Bonus

Para ir além, você pode proteger informações de arquivos sensíveis desativando as visualizações de diretórios. Por exemplo, se você visitar o diretório pai do seu tema em um navegador, o que você vê? Se as visualizações de diretórios estiverem ativadas, você obterá uma lista vinculada de todos os arquivos. Não é bom. O que você deve ver é ou uma tela branca em branco ou alguma outra resposta do servidor. Você sabe, para ajudar a manter suas informações de arquivos seguras e protegidas.

Existem inúmeras maneiras de desativar as visualizações de diretórios. A maneira do WordPress é criar um novo arquivo (vazio) index.php em qualquer diretório que você queira proteger.

Importante! Só crie um novo ficheiro index.php se já não existir um no directório. Ou seja, não sobrescreva nenhum ficheiro de índice existente.

Então em index.php, adicione o seguinte código:

<?php // Silence is golden.

WordPress core utiliza esta técnica em várias directorias. Ao desativar as visualizações de diretórios abertos, impedimos que os atacantes obtenham informações sobre quais arquivos existem no servidor. Assim, ele beneficia a segurança e é prática recomendada para todos os diretórios públicos, a não ser que você tenha coberto com .htaccess, ou talvez tenha motivos para fazer o contrário e deixar as views habilitadas para um diretório específico.

Closing thoughts

As técnicas simples descritas neste artigo são medidas de segurança comprovadas que irão impedir a execução insegura do código e impedir que erros preencham seus logs. Isso significa melhor desempenho e segurança para o seu site. Mesmo que você não esteja experimentando o tipo de erros descritos neste artigo, proteger seus arquivos de tema e plugin do acesso direto é bom para a segurança.

Jeff Starr>

Sobre o Autor
Jeff Starr = Designer. Desenvolvedor. Produtor. Escritor. Editor. Etc.