Hm...
Der Code hat einige Unzulänglichkeiten hinsichtlich der Pflegbarkeit. Es müsste nämlich bei Einpflegen weiterer Seiten tief eingegriffen werden. Das ist unübersichtlich und gibt nur Ärger.
Alternierende Vorschlag ist ETWAS WIE:
// Konfiguration
$arZulaessigeSeiten = array(
'startseite'
'impressum',
'kontakt',
'seite_1'
);
if( isset($_GET['action']) )
if ( in_array($_GET['action'],$arZulaessigeSeiten) ) {
$zuLaden = './includes-enabled/' . $_GET['action'] . '.php';
include $zuLaden; // or Fehlerbehandlung (Datei $zuLaden nicht lesbar)
} else {
include './includes-errors/404-Not_Found.php'; // or Fehlerbehandlung
}
}
// Wenn kein Action übergeben wurde oder NULL ist
else {
include './includes-enabled/startseite.php'; // or Fehlerbehandlung
}
In der Konfiguration werden die zulässigen "Seiten" gelistet, damit es später keine Sicherheits-Probleme mit dem Include gibt. Diese sollte natürlich dort stehen, wo auch andere Dinge konfiguriert werden. Der Array kann auch durch Auslesen eines Verzeichnisses (hier './includes-enabled/') gebildet werden. Das schafft die Möglichkeit weitere Includes, z.B. in './includes-available/' oder './includes-admin/' vorzuhalten, aber nicht öffentlich zugänglich zu haben.
Wenn eine 'action' übertragen wurde, dann wird diese auf Gültigkeit überprüft und im Falle der positiven Übereinstimmung das Modul geladen. Im negativen Falle die passenden Fehlerseiten.
An Stelle der Konfiguration KÖNNTE ETWAS WIE folgendes treten:
function getZulaessigeSeiten( $verzeichnis ) {
// Gibt Array zulässiger Seiten zurück.
// Aufrufbeispiel: $arZulaessigeSeiten = getZulaessigeSeiten('./includes-enabled/');
if ($handle = opendir($verzeichnis)) {
$arZulaessigeSeiten=array();
while (false !== ($dateiname = readdir($handle))) {
if (0 != strpos($dateiname, '.') { // Ausschluss versteckter Dateien
if (is_file($verzeichnis . '/' . $dateiname) ) && (is_readable($verzeichnis . '/' . $dateiname) ) ) {
$arZulaessigeSeiten[] = $entry;
}
}
}
closedir($handle);
return $arZulaessigeSeiten;
} else {
// Hier Fehlerbehandlung ("Include-Verzeichnis $verzeichnis kann nicht geöffnet werden").
// ggf. return false oder exit...
}
}
Das wäre aber Unsinn, denn dann wäre ETWAS WIE
if( isset($_GET['action']) ) {
// Ausschluss unsichtbarer Dateien wie.z.B. '.htaccess':
// Ausschluss der Adressierung von Verzeichnissen '/' - z.B. '/etc/passwd':
if ( ( 0 === str_pos($_GET['action'], '.') ) || ( ! false === str_pos($_GET['action'], '/') ) ) {
$zuLaden = './includes-errors/403-Forbidden.php'; // or Fehlerbehandlung
} else {
$zuLaden = './includes-enabled/' . $_GET['action'] . '.php'; // or Fehlerbehandlung
}
if ( is_file($zuLaden) && is_readable($zuLaden) ) {
include $zuLaden; // or Fehlerbehandlung
else {
include './includes-errors/404-Not_Found.php'; // or Fehlerbehandlung
}
}
// Wenn kein Action übergeben wurde oder NULL ist
else {
include './includes-enabled/startseite.php'; // or Fehlerbehandlung
}
... einfacher und "kostengünstiger".
Alternierend könnte ein CMS den Array $arZulaessigeSeiten automatisch beim Anlegen neuer Seiten erzeugen und in einer zu lesenden Datei ablegen. Code wie oben. Das würde auch Sinn machen und wäre sehr "kostengünstig".
Der "PHP-Code" ist eine IDEE oder ein ENTWURF und nicht getestet.
Fred