PHP/Tutorials/Templates/Alternativen

Aus SELFHTML-Wiki
< PHP‎ | Tutorials‎ | Templates
Wechseln zu: Navigation, Suche

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.

Beachten Sie: Dateien, die keinen PHP-Code enthalten, sollten besser mit 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!

Das Einbinden von Dateien sollte niemals direkt auf der Grundlage von Benutzereingaben erfolgen.
selbstmord.php
include ($_GET['file']);
Auf diese Weise könnten Angreifer beliebige Dateien einbinden und deren Inhalt anzeigen, durch http://example.org/selbstmord.php?file=../../../../../etc/passwd könnte möglicherweise die Passwortdatei des Servers ausgegeben werden.

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