Warum beginnen die meisten Joomla!-PHP-Dateien mit "defined('_JEXEC')?

From Joomla! Documentation

This page is a translated version of the page Why do most of the Joomla! PHP files start with defined(' JEXEC')? and the translation is 100% complete.
Other languages:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎العربية • ‎中文(台灣)‎

Diese Seite dokumentiert die _JEXEC-Prüfung, die zum Schutz vieler PHP-Dateien verwendet wird. Sie beschreibt, warum sie verwendet wird, wann sie zu verwenden ist und in welchen Situationen sie nicht verwendet werden sollte. Siehe auch: Warum beginnen die meisten Joomla!-PHP-Dateien mit „defined('_JEXEC')“?

Um was geht es?

Die folgende Zeile findet man häufig am Anfang von Joomla! PHP-Dateien:

defined('_JEXEC') or die('Restricted access');

Warum?

_JEXEC ist eine Konstante, die typischerweise in der Datei index.php in der Root der Joomla!-Instanz definiert und verwendet wird, um einen sicheren Einstiegspunkt in Joomla zu markieren. Die "defined or die"-Prüfung stellt sicher, dass _JEXEC im Pfad zu der Datei definiert wurde. Dies wird verwendet, um zu garantieren, dass eine Datei, die Pfadinformationen preisgeben könnte, weil Funktionen, Variablen oder Klassen nicht in dieser Datei definiert sind, die PHP-Fehlermeldung auslöst und so einen Pfad offenlegt.
Es verhindert auch das unbeabsichtigte Einschleusen von Variablen durch einen „register globals“-Angriff, bei dem der PHP-Datei vorgegaukelt wird, dass sie sich innerhalb der Anwendung befindet, obwohl dies nicht der Fall ist.

Das Absenken der Fehleranzeige hätte einen ähnlichen Effekt, allerdings gibt es Konfigurationen, bei denen eine Änderung der php.ini-Einstellungen nicht erlaubt ist. Die JEXEC-Prüfung funktioniert unabhängig davon, ob die Konfiguration geändert werden kann und hat keine anderen Nebeneffekte (z.B. wäre es beim Debuggen ärgerlich, wenn jede Datei die Fehlerberichte reduzieren würde, da man entweder ein Debug-Flag setzen müsste, um es zu stoppen oder nach jeder eingeschlossenen Datei die Fehlerberichte zurücksetzen müsste, was nicht gerade angenehm wäre).

Wann?

Die Prüfung sollte zu Dateien hinzugefügt werden, die bei direktem Zugriff eine Pfadangabe verursachen. Zum Beispiel tritt der folgende Fehler auf, wenn das Backlink System Plugin (/plugins/system/backlink.php Datei) die _JEXEC Prüfung deaktiviert hat:

Fatal error: Call to undefined function jimport() in /Users/pasamio/Sites/workspace/joomla_15/plugins/system/backlink.php on line 18

Wie zu sehen ist, existiert die Funktion "jimport" nicht, wenn die Datei direkt aufgerufen wird, so dass PHP einen Fehler auslöst und den Pfad zur Datei offenlegt. Das Hinzufügen der „defined or die“-Prüfung zu dieser Datei führt dazu, dass beim Zugriff auf die Datei die Meldung Restricted access (eingeschränkter Zugriff) angezeigt wird.

Die allgemeine Regel für die JEXEC-Prüfung ist also, dass eine PHP-Datei von einer anderen Datei abhängt, um ordnungsgemäß zu funktionieren. Wenn ohne die JEXEC-Prüfung direkt auf eine Datei zugegriffen und ein PHP-Fehler ausgelöst wird (vorausgesetzt, der PHP-Fehlerbericht ist so eingestellt, dass er standardmäßig Fehler anzeigt), weil eine Variable, eine Funktion, ein Objekt oder ähnliches fehlt, muss die Datei geschützt werden.

Einige Dateien müssen nicht vor dieser Prüfung geschützt werden. Es kann sich dabei um Dateien ohne externe Abhängigkeiten handeln (z.B. eine einfache Klasse oder ein Stückchen Code) oder es kann sich um externe Dateien handeln, die auch ohne Joomla! funktionieren können. Beispiele hierfür sind TinyMCE's GZip'd Javascript Generator, der völlig eigenständig ist.