PHP/Tutorials/Templates/Alternativen
Inhaltsverzeichnis
Dateien einbinden
Es gibt grundsätzlich vier verschiedene Möglichkeiten, Dateien einzubinden. Die Tabelle zeigt, welche der Funktionen bei welchen Anforderungen zum Einsatz kommen sollte.
readfile()
eingebunden werden. Das ist ressourcenschonender, weil diese Inhalte nicht vom PHP-Interpreter geparst werden müssen.Die einzubindende Datei … | … darf nur genau einmal verwendet werden | … kann auch mehrfach verwendet werden |
---|---|---|
… muss unbedingt vorhanden sein | require_once() | require() |
… darf auch fehlen | include_once() | include() |
mögliche Fehler
Die angeforderte Datei … | … ist nicht vorhanden | … wird mehrfach eingebunden |
---|---|---|
include() | erzeugt eine Warnung | – |
include_once() | Rückgabewert TRUE
| |
require_once() | erzeugt einen Fehler Programmabbruch | |
require() | – |
Die Funktionen
require_once()
Die einzubindende Datei enthält eine PHP-Funktion, die für die Darstellung der Seite erforderlich ist, etwa weil sie die Verbindung zur Datenbank herstellt.
Würde man diese Datei versehentlich mehrfach einbinden, käme es bereits beim zweiten Mal zu einer Fehlermeldung, weil man eine vorhandene Funktion erneut definieren möchte. PHP bindet deshalb die Datei nur dann ein, wenn diese Datei bisher noch nicht eingebunden wurde.
require()
Die einzubindende Datei ist für die Darstellung der Seite erforderlich, sie könnte aber auch an mehreren Stellen der Seite verwendet werden. Das kann etwa für Teile von Navigationen zutreffen.
include_once()
In einem größeren Projekt soll mit Konstanten gearbeitet werden, die Einstellungen werden in einer Datei gespeichert. Es ist nicht schlimm, wenn die Datei fehlt, aber eine mehrfache Einbindung würde zu einem Fehler führen, weil auch Konstanten nur einmal definiert werden können.
include()
Die einzubindende Datei ist für die Darstellung der Seite nicht erforderlich, sie kann auch an mehreren Stellen eingebunden sein. Das trifft etwa für die Auflistung von Produktdetails zu.
Sicherheit: Directory-Traversal-Lücken vorbeugen
Achtung!
include ($_GET['file']);
Solche Angriffsversuche werden Directory Traversal genannt und sie sind nicht etwa selten, sondern tägliches, automatisiert stattfindendes Geschehen und es gibt terabyteweise Benutzernamen, Passwörter und Bankdaten, die beweisen, dass grob nachlässig gehandelt wurde.
Einfach und effektiv absichern ließe sich obiger Code, indem beispielsweise erlaubte Dateien in einem Array notiert werden und der Dateiname dann über den Index aus dem Array gelesen wird, sodass kein Teil des Dateinamens durch einen Angreifer frei wählbar wäre:
$pages = [
'info' => 'info.php',
'kontakt' => 'kontakt.php',
];
if (isset($pages[$_GET['file']])) :
include($pages[$_GET['file']]);
else :
// Fehlerbehandlung, hier wurde ein ungültiger Parameter übergeben
endif;
Weblinks
- Marc Ermshaus: PHP-Includes: Niemals ohne __DIR__
- PHP Manual: include
http://example.org/selbstmord.php?file=../../../../../etc/passwd
könnte möglicherweise die Passwortdatei des Servers ausgegeben werden.