Articles

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

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

Sto vedendo un grande aumento di attacchi bot che prendono di mira direttamente i file del tema. Prima ottengono l’URL della tua directory del tema. Ci sono numerosi modi per un bot di ottenere queste informazioni. Per esempio la maggior parte dei temi include risorse come i file CSS e JavaScript, e il link include l’URL completo. Quindi, una volta che hanno l’URL del tema, i bot cattivi faranno richieste dirette per i ben noti file template del tema, come index.php e header.php. Richiedere direttamente i file template può rivelare possibili vulnerabilità di sicurezza, che apparentemente è un vettore di attacco sempre più popolare. Innesca anche gli errori “Call to undefined function get_header()” (e simili). Fortunatamente c’è una facile soluzione.

Il tuo sito è preso di mira?

Per scoprire se il tuo sito viene colpito da richieste dirette di file del tema, puoi controllare i log di accesso/errore del tuo sito. Ecco alcuni esempi dai miei log che dovrebbero aiutare a mostrare cosa cercare:

Nota: Nelle seguenti voci di log, tutti i percorsi dei file sono cambiati in URL di esempio per evitare che Google possa scansionare e segnalare errori. Nei file di log reali, gli errori contengono i percorsi dei file, non gli URL. P.S., è molto ridicolo che Googlebot strisci le informazioni del percorso in chiaro, all’interno dei tag <pre> nientemeno.
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'

Quindi, se il vostro sito è bersagliato da attacchi diretti al template, vedrete MOLTI errori di questo tipo. In questi esempi, le richieste sono per index.php, 404.php e header.php. Dalle mie analisi, la maggior parte delle richieste di template sono per questi tre file, ma potreste anche trovare la scansione di altri noti file di WordPress, come:

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

Fondamentalmente, qualsiasi richiesta diretta di un file core, tema o plugin di WordPress molto probabilmente scatenerà un errore, a meno che non vengano prese misure adeguate in anticipo. Per esempio, più avanti vedremo un modo semplice per fermare l’errore “funzione non definita”, che a sua volta aiuterà a conservare le preziose risorse del server e a migliorare la sicurezza generale del sito.

Comprendere l’errore

Cos’è l’errore fatale “call to undefined function”? Accadono perché il core di WordPress non viene caricato per i file template caricati direttamente.

Per esempio, se richiedete direttamente header.php, qualsiasi funzione del core come esc_url() non è disponibile perché il file è richiesto al di fuori di WordPress.

Cosa succede se non fate nulla? Beh, il vostro tema potrebbe aver già implementato una tecnica simile, o forse no. Qual è il rischio? A seconda di come è codificato il vostro tema, potrebbe essere possibile per i cattivi attori eseguire codice fuori contesto, il che potrebbe esporre potenziali vettori di attacco.

Come risolvere

Il modo più semplice per prevenire questo tipo di errore è semplicemente uscire dallo script se WordPress non è disponibile. Questa è un’antica ma efficace tecnica PHP usata per prevenire l’accesso diretto ai file:

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

Dice semplicemente: Se la costante ABSPATH non è definita, allora uscite dallo script. Questo funziona perché ABSPATH è definito solo quando WordPress viene caricato. Quindi, quando un bot cattivo arriva e inizia a richiedere i vostri template del tema, otterrà semplicemente una pagina bianca (risposta vuota) dal server.

Potreste aver visto un codice simile durante i vostri viaggi su WordPress. Prevenire l’accesso diretto agli script è una parte importante della sicurezza di PHP. Non volete che gli attaccanti/bot eseguano script fuori contesto, quando non sono autorizzati, e così via.

Esempio

Per implementare questa tecnica, aprite qualsiasi file di tema che è stato preso di mira, e includete la linea in cima al file. Per esempio, molti modelli di tema includono l’intestazione prima di qualsiasi altro codice, come questo:

<?php get_header(); ?>

Dopo aver aggiunto lo snippet “nessun accesso diretto”, avrete qualcosa come:

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

Comunque decidiate di formattare il codice va bene, il punto è includere la linea ABSPATH prima che qualsiasi altra funzione sia chiamata.

Consiglio professionale: Vuoi fermare altri bot cattivi? Controlla il mio plugin gratuito per WordPress, Blackhole for Bad Bots, disponibile nella WP Plugin Directory.

Bonus

Per andare oltre, è possibile proteggere le informazioni sensibili dei file disabilitando le visualizzazioni delle directory. Per esempio, se visitate la directory madre del vostro tema in un browser, cosa vedete? Se le visualizzazioni delle directory sono abilitate, otterrete un elenco collegato di tutti i file. Non va bene. Quello che dovresti vedere è una schermata bianca vuota o qualche altra risposta del server. Sapete, per aiutare a mantenere le vostre informazioni sui file sicure e protette.

Ci sono numerosi modi per disabilitare le visualizzazioni delle directory. Il modo WordPress è quello di creare un nuovo file (vuoto) index.php in qualsiasi directory tu voglia proteggere.

Importante! Create un nuovo file index.php solo se non ne esiste già uno nella directory. Cioè, non sovrascrivere nessun file indice esistente.

Poi in index.php, aggiungere il seguente codice:

<?php // Silence is golden.

Il core di WordPress usa questa tecnica in varie directory. Disabilitando le viste di directory aperte, impediamo agli attaccanti di ottenere informazioni su quali file esistono sul server. Quindi è un vantaggio per la sicurezza ed è una pratica raccomandata per tutte le directory pubbliche, a meno che non si sia coperto con .htaccess, o forse si ha motivo di fare altrimenti e lasciare le viste abilitate per una directory specifica.

Pensieri conclusivi

Le semplici tecniche descritte in questo articolo sono misure di sicurezza provate che impediranno l’esecuzione di codice non sicuro e impediranno agli errori di riempire i vostri log. Questo significa migliori prestazioni e sicurezza per il vostro sito. Anche se non stai sperimentando il tipo di errori descritti in questo articolo, proteggere i file del tuo tema e dei plugin dall’accesso diretto è un bene per la sicurezza.

Jeff Starr

Informazioni sull’autore
Jeff Starr = Designer. Sviluppatore. Produttore. Scrittore. Editore. Ecc.