Articles

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

♦ Geplaatst door Jeff Starr in PHP, Security
januari 11, 2019

Ik zie een grote toename van botaanvallen die zich rechtstreeks richten op themabestanden. Eerst krijgen ze de URL naar je themamap. Er zijn talloze manieren voor een bot om aan deze informatie te komen. De meeste thema’s bevatten bijvoorbeeld CSS en JavaScript bestanden, en de link bevat de volledige URL. Dus als ze eenmaal de URL van het thema hebben, zullen slechte bots directe aanvragen doen voor bekende sjabloonbestanden van het thema, zoals index.php en header.php. Het direct opvragen van sjabloonbestanden kan mogelijke beveiligingslekken aan het licht brengen, wat blijkbaar een steeds populairdere aanvalsvector is. Het veroorzaakt ook de “Call to undefined function get_header()” (en soortgelijke) fouten. Gelukkig is er een eenvoudige oplossing.

Is uw site een doelwit?

Om erachter te komen of uw site wordt getroffen door directe verzoeken om themabestanden, kunt u de toegangs-/foutlogs van uw site controleren. Hier zijn enkele voorbeelden van mijn eigen logs die zouden moeten helpen om te laten zien waar u naar moet zoeken:

Opmerking: In de volgende logboekvermeldingen zijn alle bestandspaden veranderd in voorbeeld-URL’s om te voorkomen dat Google fouten gaat crawlen en rapporteren. In de echte log bestanden, bevatten fouten bestandspaden, geen URLs. P.S., het is zeer belachelijk dat Googlebot platte-tekst pad informatie crawlt, binnen <pre> tags niet minder.
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'

Dus als uw site het doelwit is van direct-template aanvallen, zult u VEEL van dit soort fouten zien. In deze voorbeelden zijn de verzoeken voor index.php, 404.php, en header.php. Uit mijn analyses blijkt dat de meeste template verzoeken voor deze drie bestanden zijn, maar het kan ook zijn dat ze naar andere bekende WordPress bestanden scannen, zoals:

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

Basically, elk direct verzoek naar een WordPress core, theme, of plugin bestand zal hoogstwaarschijnlijk een fout veroorzaken, tenzij de juiste maatregelen van te voren zijn genomen. Later zullen we bijvoorbeeld kijken naar een eenvoudige manier om de “ongedefinieerde functie” fout te stoppen, die op zijn beurt zal helpen om kostbare server resources te behouden en de algehele site veiligheid te verbeteren.

De fout begrijpen

Dus wat is er met de “oproep naar ongedefinieerde functie” fatale fouten? Ze gebeuren omdat WordPress core niet wordt geladen voor direct geladen template bestanden.

Bijv. als u header.php rechtstreeks opvraagt, zijn eventuele core-functies zoals esc_url() niet beschikbaar omdat het bestand buiten WordPress wordt opgevraagd.

Wat gebeurt er als u niets doet? Nou, uw thema heeft misschien al een soortgelijke techniek geïmplementeerd, of misschien ook niet. Wat is het risico? Afhankelijk van hoe uw thema is gecodeerd, kan het mogelijk zijn voor slechte actoren om code buiten de context uit te voeren, waardoor potentiële aanvalsvectoren kunnen worden blootgesteld.

Hoe op te lossen

De eenvoudigste manier om dit soort fouten te voorkomen, is om het script gewoon af te sluiten als WordPress niet beschikbaar is. Dit is een oude maar effectieve PHP techniek die wordt gebruikt om directe bestandstoegang te voorkomen:

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

Het zegt simpelweg: Als de ABSPATH constante niet is gedefinieerd, verlaat dan het script. Dit werkt omdat ABSPATH alleen wordt gedefinieerd als WordPress wordt geladen. Dus wanneer een slechte bot langskomt en begint te vragen naar uw thema sjablonen, zal het gewoon een lege pagina (leeg antwoord) van de server krijgen.

Je hebt misschien soortgelijke code gezien tijdens je WordPress reizen. Het voorkomen van directe script toegang is een belangrijk onderdeel van PHP beveiliging. U wilt niet dat aanvallers/bots scripts uitvoeren buiten de context, wanneer ze niet geautoriseerd zijn, enzovoort.

Example

Om deze techniek te implementeren, opent u alle themabestanden die het doelwit zijn, en neemt u de regel bovenaan het bestand op. Bijvoorbeeld, veel thema sjablonen bevatten de header voor alle andere code, ziet er als volgt uit:

<?php get_header(); ?>

Na het toevoegen van de “geen directe toegang” snippet, heb je iets als:

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

Hoe je ook besluit om de code op te maken is prima, het punt is om de ABSPATH regel op te nemen voordat alle andere functies worden aangeroepen.

Pro Tip: Wil je meer slechte bots tegenhouden? Bekijk dan mijn gratis WordPress plugin, Blackhole for Bad Bots, beschikbaar in de WP Plugin Directory.

Bonus

Om verder te gaan, kun je gevoelige bestandsinformatie beschermen door directoryweergaven uit te schakelen. Bijvoorbeeld, als je de hoofdmap van je thema bezoekt in een browser, wat zie je dan? Als directoryweergaven zijn ingeschakeld, krijg je een gekoppelde lijst van alle bestanden. Dat is niet goed. Wat je zou moeten zien is of een leeg wit scherm of een andere server response. Je weet wel, om je bestandsinformatie veilig te houden.

Er zijn verschillende manieren om directoryweergaven uit te schakelen. De WordPress manier is om een nieuw (leeg) index.php bestand aan te maken in de directory die u wilt beveiligen.

Belangrijk! Maak alleen een nieuw index.php bestand aan als er NIET al een bestaat in de directory. Dat wil zeggen, overschrijf geen bestaande indexbestanden.

Dan in index.php, voeg de volgende code toe:

<?php // Silence is golden.

WordPress core gebruikt deze techniek in verschillende directories. Door open directoryweergaven uit te schakelen, voorkomen we dat aanvallers informatie krijgen over welke bestanden er op de server staan. Het komt de veiligheid dus ten goede en het is een aanbevolen praktijk voor alle openbare directory’s, tenzij u het hebt afgedekt met .htaccess, of misschien reden hebt om het anders te doen en weergaven ingeschakeld te laten voor een specifieke directory.

Losse gedachten

De eenvoudige technieken die in dit artikel zijn beschreven, zijn beproefde beveiligingsmaatregelen die voorkomen dat onveilige code wordt uitgevoerd en ervoor zorgen dat uw logboeken niet langer worden gevuld met fouten. Dat betekent betere prestaties en meer veiligheid voor uw site. Zelfs als u geen last hebt van het soort fouten dat in dit artikel is beschreven, is het goed voor de veiligheid om uw thema- en pluginbestanden te beschermen tegen directe toegang.

Jeff Starr

Over de auteur
Jeff Starr = Ontwerper. Ontwikkelaar. Producent. Schrijver. Redacteur. Etc.