Mit PHP eigene Dateien oder Programm-Code in einem WordPress-Beitrag einbauen: So geht’s! Mit dem Content-Management-System WordPress lassen sich schicke Webseiten gestalten, die später von anderen Nutzern mit weniger oder auch gänzlich ohne Programmierkenntnisse gepflegt werden können.
Sollen komplexere Elemente aber in einem WordPress Beitrag oder auf einer Seite eingebaut werden, kann das andere Nutzer schnell verwirren und zu unübersichtlichem Code führen – hier hilft es, den zusätzlichen Programm- oder auch HTML-Code in eine Datei auszulagern, die später beim Aufrufen der Seite automatisch eingefügt wird.
Dies funktioniert zum Beispiel mit dem Plugin Insert PHP: Damit lassen sich in einem Beitrag oder auf einer Seite PHP-Kommandos (wie “echo” oder “include”) angeben, die später ausgeführt werden. Dies kann aber ein Sicherheits-Risiko darstellen, da jeder mit Zugang zu dem WordPress Backend auch einen PHP Code ausführen kann.
Kein Plugin: Selber Datein einbinden
Eine weitere Möglichkeit, ganz ohne Plugin, ist eine kleine Änderung der “functions.php” Datei im Ordner des aktuellen Themes: Hier kann man dann selber festlegen, dass nur Dateien aus einem bestimmten Ordner geladen werden dürfen – und wenn man dort keine PHP Programm-Codes braucht sondern nur HTML Design-Elemente auslageren möchte, kann man sogar nur HTML Dateien zulassen: Dadurch haben Angreifer es nicht mehr so leicht, aus dem WordPress Backend eigenen Code einzuschleusen.
In die Datei functions.php ergänzt man folgenden PHP Code (wie das dann aussieht, zeigen wir weiter unten!):
// Include PHP Datei
function include_php($atts = [], $content = null, $tag = '') {
extract(shortcode_atts(array('datei' => ''), $atts));
if(!empty($datei)
&& !strstr('/',$datei)
&& file_exists(TEMPLATEPATH.'/includes/'.$datei)) {
ob_start();
include(TEMPLATEPATH.'/includes/'.$datei);
$return = ob_get_clean();
return $return;
}
}
add_shortcode('php', 'include_php');
Anschließend erstellt man in dem Theme-Ordner einen neuen Ordner mit dem Namen “includes”: Hier speichert man jetzt die neuen PHP Dateien, die man aus einem WordPress Beitrag einbinden möchte.
Das Einbinden aus einem Beitrag oder aus einer Seite heraus geht dann mit diesem Code:
[php datei='team.php']
Das Skript kann aus Sicherheitsgründen aber nur Dateien aus dem angegebenen Ordner “icludes” öffnen, Unterordner oder übergeordnete Ordner werden nicht per include eingebunden – dafür sorgt dieser Teil der IF-Abfrage:
!strstr('/',$datei)
Damit werden Ordner ausfiltert: Aus dem Beitrag heraus lässt sich also auch mit dem neuen Shortcode die Datei “../../…/var/www/server.conf” nicht öffnen, da das Trennzeichen für Ordner, der Schrägstrich “/” in dem übergebenen Dateinamen nicht vorkommen darf.
Sicherer machen: Nur HTML laden
Möchte man das Skript noch sicherer machen und nicht nur auf einen einzigen Ordner, sondern auch auf nicht ausführbare Dateien (zum Beispiel .html) beschränken, hilft diese kleine Abwandlung: Damit braucht in dem WordPress-Beitrag keine Datei-Endung mehr angegeben zu werden, da automatisch “.html” an die übermittelte Variable angehängt wird.
Der Code für die Datei functions.php sieht dann so aus:
// HTML Datei lesen
function include_php($atts = [], $content = null, $tag = '') {
extract(shortcode_atts(array('datei' => ''), $atts));
if(!empty($datei)
&& !strstr('/',$datei)
&& file_exists(TEMPLATEPATH.'/includes/'.$datei.'.html')) {
ob_start();
readfile(TEMPLATEPATH.'/includes/'.$datei.'.html');
$return = ob_get_clean();
return $return;
}
}
add_shortcode('php', 'include_php');
Eingebunden wird die Datei dann aus dem Beitrag heraus mit diesem Code:
[php datei='team']