Navigation
 Startseite
 Fachbücher
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte Internetdienstleistungen...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains und...
https://www.Hosterplus.de
 
 
 

Verzeichnis mit PHP ausgeben

Sie befinden sich: Home > Php Tutorial > Verzeichnis mit PHP ausgebe...

Verzeichnis mit PHP ausgeben


Eintrag am:  24.11.2009
Hits / Besucher:  9223
Sprache:  Deutsch
Kategorie:  Einsteiger Tutorials...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

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. 

 

PHP-Verzeichnisausgabe Tutorial mit grafischen Icons und Stichpunkten zu Themen wie Codequalität, Sicherheitsaspekte, Fehlerbehandlung, sichere Ausgabe, Iteration durch Elemente, Verzeichnis schließen und URL- sowie Verzeichnisbestimmung.

 

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.

 

Tags:

 

Artikel hinzufügen bei:
         
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.