Articles

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

♦ Postat av Jeff Starr i PHP, Säkerhet
Januari 11, 2019

Jag ser en stor ökning av bot-attacker som riktar sig direkt mot temafiler. Först får de URL:en till din temakatalog. Det finns många sätt för en bot att få den här informationen. Till exempel innehåller de flesta teman tillgångar som CSS- och JavaScript-filer, och länken innehåller den fullständiga webbadressen. Så när de väl har fått URL:en till temat gör dåliga robotar direkta förfrågningar om välkända temamallfiler, t.ex. index.php och header.php. Att begära mallfiler direkt kan avslöja eventuella säkerhetsbrister, vilket tydligen är en alltmer populär angreppsvektor. Det utlöser också felet ”Call to undefined function get_header()” (och liknande). Lyckligtvis finns det en enkel lösning.

Är din webbplats måltavla?

För att ta reda på om din webbplats drabbas av direkta förfrågningar om temafiler kan du kontrollera webbplatsens åtkomst-/felloggar. Här är några exempel från mina egna loggar som visar vad du ska leta efter:

Observera: I följande loggposter har alla filsökvägar ändrats till exempel-URL:er för att hindra Google från att söka igenom och rapportera fel. I de faktiska loggfilerna innehåller felen filvägar, inte webbadresser. P.S., det är högst löjligt att Googlebot kryper fram sökvägsinformation i klartext, inuti <pre>-taggar dessutom.
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'

Så om din webbplats är måltavla för direkta attacker mot mallar kommer du att få se MASSOR av den här typen av fel. I de här exemplen gäller förfrågningarna index.php, 404.php och header.php. Enligt mina analyser är de flesta mallförfrågningar för dessa tre filer, men du kan också hitta dem som söker efter andra välkända WordPress-filer, t.ex.:

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

Grundläggande är att alla direkta förfrågningar om en WordPress-kärn-, tema- eller insticksmodulfil med största sannolikhet kommer att utlösa ett fel, om inte lämpliga åtgärder vidtas i förväg. Senare kommer vi till exempel att titta på ett enkelt sätt att stoppa felet ”odefinierad funktion”, vilket i sin tur bidrar till att spara värdefulla serverresurser och förbättra den övergripande säkerheten på webbplatsen.

Förstå felet

Så vad är det för fel med ”anrop till odefinierad funktion”? De inträffar eftersom WordPress core inte laddas för direkt inlästa mallfiler.

Till exempel, om du begär header.php direkt är alla kärnfunktioner som esc_url() inte tillgängliga eftersom filen begärs utanför WordPress.

Vad händer om du inte gör någonting? Tja, ditt tema kanske redan har implementerat en liknande teknik, eller kanske inte. Vad är risken? Beroende på hur ditt tema är kodat kan det vara möjligt för dåliga aktörer att exekvera kod utanför sitt sammanhang, vilket kan exponera potentiella angreppsvektorer.

Hur man åtgärdar

Det enklaste sättet att förhindra den här typen av fel är att helt enkelt avsluta skriptet om WordPress inte är tillgängligt. Detta är en gammal men effektiv PHP-teknik som används för att förhindra direkt filåtkomst:

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

Det står helt enkelt: Om konstanten ABSPATH inte är definierad, avsluta skriptet. Detta fungerar eftersom ABSPATH endast definieras när WordPress laddas. Så när en dålig bot kommer och börjar begära dina temamallar får den helt enkelt en tom sida (tomt svar) från servern.

Du kanske har sett liknande kod under dina WordPress-resor. Att förhindra direkt scriptåtkomst är en viktig del av PHP-säkerheten. Du vill inte att angripare/robotar ska köra skript utanför sitt sammanhang, när de inte är auktoriserade och så vidare.

Exempel

För att implementera den här tekniken öppnar du alla temafiler som är måltavlor och inkluderar raden högst upp i filen. Många temamallar inkluderar till exempel rubriken före all annan kod, och det ser ut så här:

<?php get_header(); ?>

När du har lagt till ”no direct access”-utdraget har du något som ser ut så här:

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

Hur du än bestämmer dig för att formatera koden går det bra, poängen är att inkludera ABSPATH-linjen före alla andra funktioner som anropas.

Pro tips: Vill du stoppa fler dåliga robotar? Kolla in mitt kostnadsfria WordPress-plugin, Blackhole for Bad Bots, som finns i WP Plugin Directory.

Bonus

För att gå ännu längre kan du skydda känslig filinformation genom att inaktivera katalogvisningar. Om du till exempel besöker ditt temas föräldrakatalog i en webbläsare, vad ser du då? Om katalogvyer är aktiverade får du en länkad lista över alla filer. Inte bra. Vad du bör se är antingen en tom vit skärm eller något annat serversvar. Du vet, för att hjälpa till att hålla din filinformation säker och trygg.

Det finns många sätt att inaktivera katalogvyer. WordPress-sättet är att skapa en ny (tom) index.php-fil i den katalog du vill skydda.

Viktigt! Skapa endast en ny index.php-fil om en sådan INTE redan finns i katalogen. Det vill säga, skriv inte över befintliga indexfiler.

Sedan i index.php lägger du till följande kod:

<?php // Silence is golden.

WordPress core använder den här tekniken i olika kataloger. Genom att inaktivera visningar av öppna kataloger förhindrar vi att angripare får information om vilka filer som finns på servern. Så det gynnar säkerheten och är rekommenderad praxis för alla offentliga kataloger, om du inte har täckt det med .htaccess, eller om du kanske har anledning att göra något annat och låta vyer vara aktiverade för en specifik katalog.

Sluttande tankar

De enkla tekniker som beskrivs i den här artikeln är beprövade säkerhetsåtgärder som förhindrar att osäker kod exekveras och hindrar fel från att fylla dina loggar. Det innebär bättre prestanda och säkerhet för din webbplats. Även om du inte upplever den typ av fel som beskrivs i den här artikeln är det bra för säkerheten att skydda dina tema- och plugin-filer från direktåtkomst.

Jeff Starr

Om författaren
Jeff Starr = Designer. Utvecklare. Producent. Författare. Redaktör. Etc.