Articles

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

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

Ich beobachte eine starke Zunahme von Bot-Angriffen, die direkt auf Theme-Dateien abzielen. Zuerst erhalten sie die URL zu Ihrem Theme-Verzeichnis. Es gibt zahlreiche Möglichkeiten für einen Bot, diese Informationen zu erhalten. Beispielsweise enthalten die meisten Themes Dateien wie CSS- und JavaScript-Dateien, und der Link enthält die vollständige URL. Sobald sie also die URL des Themes haben, werden bösartige Bots direkte Anfragen nach bekannten Theme-Vorlagendateien stellen, wie index.php und header.php. Das direkte Anfordern von Vorlagendateien kann mögliche Sicherheitslücken aufdecken, was offenbar ein zunehmend beliebter Angriffsvektor ist. Außerdem werden dadurch die Fehler „Aufruf einer undefinierten Funktion get_header()“ (und ähnliche) ausgelöst. Zum Glück gibt es eine einfache Lösung.

Ist Ihre Website betroffen?

Um herauszufinden, ob Ihre Website von direkten Anfragen nach Themadateien betroffen ist, können Sie die Zugriffs-/Fehlerprotokolle Ihrer Website überprüfen. Hier sind einige Beispiele aus meinen eigenen Protokollen, die Ihnen zeigen, wonach Sie suchen sollten:

Hinweis: In den folgenden Protokolleinträgen sind alle Dateipfade in Beispiel-URLs geändert, um zu verhindern, dass Google sie crawlt und Fehler meldet. In den eigentlichen Protokolldateien enthalten die Fehler Dateipfade, keine URLs. P.S.: Es ist höchst lächerlich, dass Googlebot Klartext-Pfadinformationen crawlt, und zwar innerhalb von <pre>-Tags.
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'

Wenn Ihre Website mit direkten Template-Angriffen angegriffen wird, werden Sie also eine Menge dieser Fehlerarten sehen. In diesen Beispielen sind die Anfragen für index.php, 404.php und header.php. Meinen Analysen zufolge beziehen sich die meisten Template-Anfragen auf diese drei Dateien, aber es kann auch vorkommen, dass nach anderen bekannten WordPress-Dateien gesucht wird, z. B.:

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

Grundsätzlich wird jede direkte Anfrage nach einer WordPress-Kern-, Theme- oder Plugin-Datei höchstwahrscheinlich einen Fehler auslösen, wenn nicht zuvor geeignete Maßnahmen ergriffen werden. Später werden wir uns zum Beispiel eine einfache Möglichkeit ansehen, den Fehler „undefinierte Funktion“ zu stoppen, was wiederum dazu beiträgt, wertvolle Serverressourcen zu sparen und die Sicherheit der Website insgesamt zu verbessern.

Den Fehler verstehen

Was hat es also mit den fatalen Fehlern „Aufruf einer undefinierten Funktion“ auf sich? Sie treten auf, weil der WordPress-Kern bei direkt geladenen Template-Dateien nicht geladen wird.

Wenn Sie zum Beispiel header.php direkt anfordern, sind alle Core-Funktionen wie esc_url() nicht verfügbar, weil die Datei außerhalb von WordPress angefordert wird.

Was passiert, wenn Sie nichts tun? Nun, vielleicht hat Ihr Theme bereits eine ähnliche Technik implementiert, vielleicht aber auch nicht. Was ist das Risiko? Je nachdem, wie Ihr Theme kodiert ist, kann es möglich sein, dass böswillige Akteure Code aus dem Kontext heraus ausführen, wodurch potenzielle Angriffsvektoren aufgedeckt werden können.

Behebung

Die einfachste Möglichkeit, diese Art von Fehler zu verhindern, besteht darin, das Skript einfach zu beenden, wenn WordPress nicht verfügbar ist. Dies ist eine uralte, aber effektive PHP-Technik, die verwendet wird, um den direkten Dateizugriff zu verhindern:

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

Sie besagt einfach: Wenn die Konstante ABSPATH nicht definiert ist, dann beende das Skript. Das funktioniert, weil ABSPATH nur definiert ist, wenn WordPress geladen wird. Wenn also ein böser Bot daherkommt und anfängt, Ihre Themenvorlagen anzufordern, wird er einfach eine leere Seite (leere Antwort) vom Server erhalten.

Sie haben vielleicht schon ähnlichen Code auf Ihren WordPress-Reisen gesehen. Die Verhinderung des direkten Skriptzugriffs ist ein wichtiger Bestandteil der PHP-Sicherheit. Sie wollen nicht, dass Angreifer/Bots Skripte außerhalb des Kontexts, ohne Autorisierung usw. ausführen.

Beispiel

Um diese Technik zu implementieren, öffnen Sie alle Themadateien, die betroffen sind, und fügen Sie die Zeile am Anfang der Datei ein. Viele Themenvorlagen enthalten zum Beispiel die Kopfzeile vor jedem anderen Code. Das sieht dann so aus:

<?php get_header(); ?>

Nach dem Hinzufügen des Schnipsels „kein direkter Zugriff“ haben Sie etwas wie:

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

Wie auch immer Sie den Code formatieren, wichtig ist, dass Sie die ABSPATH-Zeile einfügen, bevor andere Funktionen aufgerufen werden.

Profi-Tipp: Möchten Sie noch mehr böse Bots stoppen? Schauen Sie sich mein kostenloses WordPress-Plugin Blackhole for Bad Bots an, das im WP Plugin Directory erhältlich ist.

Bonus

Um noch weiter zu gehen, können Sie sensible Dateiinformationen schützen, indem Sie Verzeichnisansichten deaktivieren. Was sehen Sie zum Beispiel, wenn Sie Ihr Theme-Elternverzeichnis in einem Browser besuchen? Wenn die Verzeichnisansichten aktiviert sind, erhalten Sie eine verknüpfte Liste aller Dateien. Das ist nicht gut. Was Sie sehen sollten, ist entweder ein leerer weißer Bildschirm oder eine andere Serverantwort. Sie wissen schon, damit Ihre Dateiinformationen sicher und geschützt sind.

Es gibt zahlreiche Möglichkeiten, die Verzeichnisansichten zu deaktivieren. Die WordPress-Methode besteht darin, eine neue (leere) index.php-Datei in dem Verzeichnis zu erstellen, das Sie schützen möchten.

Wichtig! Erstellen Sie nur dann eine neue index.php-Datei, wenn NICHT bereits eine in dem Verzeichnis vorhanden ist. Das heißt, überschreiben Sie keine vorhandenen Indexdateien.

Fügen Sie dann in index.php den folgenden Code ein:

<?php // Silence is golden.

Der WordPress-Kern verwendet diese Technik in verschiedenen Verzeichnissen. Durch die Deaktivierung der offenen Verzeichnisansichten verhindern wir, dass Angreifer Informationen darüber erhalten, welche Dateien auf dem Server vorhanden sind. Dies kommt der Sicherheit zugute und wird für alle öffentlichen Verzeichnisse empfohlen, es sei denn, Sie haben es mit .htaccess abgedeckt oder haben vielleicht einen Grund, etwas anderes zu tun und die Ansichten für ein bestimmtes Verzeichnis aktiviert zu lassen.

Abschließende Überlegungen

Die in diesem Artikel beschriebenen einfachen Techniken sind bewährte Sicherheitsmaßnahmen, die die Ausführung von unsicherem Code verhindern und dafür sorgen, dass Ihre Protokolle nicht mit Fehlern gefüllt werden. Das bedeutet bessere Leistung und Sicherheit für Ihre Website. Selbst wenn Sie nicht mit den in diesem Artikel beschriebenen Fehlern konfrontiert werden, ist der Schutz Ihrer Theme- und Plugin-Dateien vor direktem Zugriff gut für die Sicherheit.

Jeff Starr

Über den Autor
Jeff Starr = Designer. Entwickler. Producer. Writer. Editor. Etc.