In diesem Tutorial möchte ich Ihnen ausführlich erklären, wie Sie mit PHP ein Verzeichnis ausgeben können. Dabei gehe ich auf jedes Detail des Codes ein und zeige Ihnen, wie er funktioniert und warum er so geschrieben wurde. Der Grund, warum ich dieses Tutorial verfasse, liegt darin, dass immer wieder Fragen in unserem Forum aufkommen. Deshalb möchte ich Ihnen eine umfassende Anleitung bieten, die Ihnen Schritt für Schritt zeigt, wie Sie Verzeichnisse und deren Inhalte auf Ihrer Webseite anzeigen können.

Inhaltsverzeichnis
Nachfolgend präsentiere ich Ihnen ein aktualisiertes Beispielskript, das moderne PHP-Praktiken und Sicherheitsaspekte berücksichtigt und typische Warnungen sowie Fehler adressiert:
<?php
// Sicheres Einlesen des 'dir'-Parameters aus der URL
$verzeichnis = filter_input(INPUT_GET, 'dir', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: realpath(__DIR__);
// Überprüfen, ob der Pfad ein gültiges Verzeichnis ist
if (!is_dir($verzeichnis)) {
die('Ungültiges Verzeichnis.');
}
// Ermittlung der Basis-URL für die Linkerstellung
$host = $_SERVER['HTTP_HOST'] ?? 'localhost';
$url = 'http://' . $host . dirname($_SERVER['PHP_SELF']);
// Versuch, das Verzeichnis zu öffnen mit Fehlerbehandlung
$fp = @opendir($verzeichnis);
if (!$fp) {
die('Verzeichnis kann nicht geöffnet werden.');
}
while (false !== ($file = readdir($fp))) {
// Auslassen der speziellen Verzeichniseinträge '.' und '..'
if ($file === '.' || $file === '..') continue;
$pfad = $verzeichnis . DIRECTORY_SEPARATOR . $file;
if (is_file($pfad)) {
// Erstellen von sicheren Links für Dateien
echo '<a href="' . htmlspecialchars($url . '/' . $file) . '">' . htmlspecialchars($file) . '</a><br>';
} else {
// Erstellen von sicheren Links für Verzeichnisse mit URL-Kodierung
echo '<a href="?dir=' . urlencode($pfad) . '/">' . htmlspecialchars($file) . '</a><br>';
}
}
closedir($fp);
?>
Ermittlung der URL und des Verzeichnisses
In der aktualisierten Version verwenden wir filter_input() mit dem Filter FILTER_SANITIZE_FULL_SPECIAL_CHARS
, um den Pfad aus der Benutzereingabe sicher zu verarbeiten. Dadurch ersetzen wir die veraltete Konstante FILTER_SANITIZE_STRING
. Das Verzeichnis wird entweder aus der gefilterten Benutzereingabe genommen oder auf das aktuelle Verzeichnis realpath(__DIR__)
gesetzt, falls keine Eingabe erfolgt. Zudem überprüfen wir mit is_dir()
, ob der Pfad tatsächlich ein gültiges Verzeichnis ist.
Die Ermittlung der Basis-URL berücksichtigt nun, dass $_SERVER['HTTP_HOST']
eventuell nicht gesetzt sein könnte (z. B. bei Kommandozeilenausführung). Durch den Null-Koaleszenz-Operator (??
) setzen wir in diesem Fall den Host auf 'localhost'
. Dies verhindert Warnungen zum undefinierten Array-Schlüssel.
Moderne Sicherheitsaspekte im Code
Die wichtigsten Sicherheitsmaßnahmen im aktualisierten Code sind:
- Eingabevalidierung und -sanitierung: Durch
filter_input()
mit FILTER_SANITIZE_FULL_SPECIAL_CHARS
wird die Benutzereingabe aus $_GET['dir']
gefiltert, wodurch potenzielle Angriffe eingeschränkt werden.
- Überprüfung der Verzeichnisgültigkeit: Mit
is_dir()
stellen wir sicher, dass nur mit gültigen Verzeichnissen gearbeitet wird.
- Sichere Ausgabe: Funktionen wie
htmlspecialchars()
und urlencode()
sorgen dafür, dass ausgegebene Links korrekt kodiert sind und keine Sicherheitslücken, wie XSS, entstehen.
Öffnen des Verzeichnisses mit Fehlerbehandlung
Beim Versuch, das Verzeichnis zu öffnen, nutzen wir den Fehlerunterdrückungsoperator @
vor opendir()
. Dadurch werden Warnungen unterdrückt, falls z. B. keine Berechtigung zum Öffnen des Verzeichnisses besteht. Anschließend prüfen wir, ob opendir()
erfolgreich war. Falls nicht, wird eine aussagekräftige Fehlermeldung ausgegeben und die Ausführung mit die()
abgebrochen. Diese Ausnahmebehandlung stellt sicher, dass das Skript bei Fehlern nicht unerwartet weiterläuft.
Iterieren durch Verzeichniselemente
Mit der while
-Schleife durchlaufen wir alle Elemente im geöffneten Verzeichnis. Wir überspringen die speziellen Einträge .
und ..
, um Endlosschleifen oder ungewollte Pfadnavigation zu vermeiden. Dies ist eine grundlegende Sicherheitsmaßnahme, die auch die Lesbarkeit des Codes erhöht.
Sichere Ausgabe und Linkerstellung
Für jedes Element im Verzeichnis wird geprüft, ob es sich um eine Datei oder einen Unterordner handelt. Dabei werden folgende Sicherheitsmaßnahmen beachtet:
- Dateien: Links zu Dateien werden mithilfe von
htmlspecialchars()
erstellt, um sowohl den angezeigten Namen als auch die URL sicher zu kodieren.
- Verzeichnisse: Links zu Unterverzeichnissen werden mit
urlencode()
für den Pfad erstellt, um sicherzustellen, dass alle Zeichen im URL korrekt dargestellt werden. Zusätzlich wird htmlspecialchars()
verwendet, um den angezeigten Text sicher auszugeben.
Diese Maßnahmen verhindern, dass schädlicher Code in die Webseite gelangt und stellen sicher, dass die Navigation innerhalb der Verzeichnisstruktur sicher ist.
Schließen des Verzeichnisses
Nach Abschluss des Durchlaufens aller Einträge wird der Verzeichnis-Handle mit closedir($fp)
geschlossen. Dies gibt Systemressourcen frei und verhindert, dass Verzeichnisse weiterhin geöffnet bleiben, was zu Sicherheits- oder Performance-Problemen führen könnte.
Überlegungen zur Codequalität
Obwohl der angepasste Code funktional und sicherer gestaltet ist, gibt es weitere Aspekte zur Verbesserung der Codequalität:
- Fehlende Modularität: Der gesamte Ablauf befindet sich noch in einem einzigen Skript. Für größere Anwendungen wäre es sinnvoll, Logik, Sicherheit und Präsentation in separate Module oder Klassen zu unterteilen.
- Verbesserte Fehlerbehandlung: Neben der aktuellen einfachen Fehlerbehandlung könnten detailliertere Ausnahmen und Logging-Mechanismen integriert werden, um komplexere Fehlerfälle zu handhaben.
- Aktuelle PHP-Standards: Der Code kann weiter modernisiert werden, indem moderne PHP-Features und -Best Practices angewendet werden, etwa durch Nutzung eines Frameworks, das viele Sicherheits- und Strukturprobleme von Haus aus löst.