PHP Fehlermeldung abfangen

Hi Leute, hab mal wieder ne Frage im Bereich PHP:

Ich lade in meine Site per include() die Inhalte rein, abhängig ist das ganze von ner Variable namens $sid.

Ich hab also in der URL zum Beispiel “index.php?sid=aktuelles”

Die Site lädt dann einfach an der entsprechenden Stelle eines PHP-Datei mit namen “aktuelles.php” aus dem Ordner “sites” rein. Und das natürlich ohne Rücksicht auf Verluste^^

Will heißen, es wird nicht überprüft ob die Site überhaupt existiert, falls nicht bekomme ich halt ne unschöne Fehlermeldung. Soweit sogut jetzt seid ihr dran :wink:

Wie kann ich die Fehlermeldung abfangen und stattdessen ne Art 404-Seite anzeigen?
Gibts ne if-Abfrage à la “Existiert diese Datei überhaupt?”

Bin gespannt auf eure Antworten :smiley:

hi

kurz, übersichtlich und sollte auch funktionieren :wink:

(ist zwar nicht das optimalste mit if & file_exists aber es tut seinen zweck)

mfg Joey

Hey danke für die echt flotte Antwort!

Mit dem @ stell ich praktisch ein dass ich meine eigene Fehlermeldun angebe?

$loc = $_GET['loc'];

$loc = str_replace("..", "", $loc); //".." in Verzeichnisnamen nix gut ;)
$loc = dirname(__FILE__)."/pages/".$loc; //Absoluter Pfad

if(!file_exists($loc))
  include "pages/404.php";
else
  include $loc;

Das sollte funktionieren :wink:

hi,

erstmal: bitte, gerngeschehen :wink:

[quote]Mit dem @ stell ich praktisch ein dass ich meine eigene Fehlermeldun angebe?[/quote]Nein, das stimmt so nicht ganz…
das @ unterbindet sozusagen die Fehlermeldung von include(), dies geht bei vielen Funktionen, jedoch nicht bei allen…
was if bedeutet ist ja wohl klar, oder?
und das ! vor der (fehlerunterbungenen) Funktion bewirkt, dass wenn ein false von include zurückgegeben wird, was hier ja der fall ist, da die Datei (evtl) nicht besteht, die if anweisung gültig (also ture) ist, und somit wird dann der folgende echo-Befehl ausgeführt :wink:

mfg Joey

Und das wiederum heisst, dass du sehr naiv programmierst.

Du solltest vorab überprüfen, ob die Datei überhaupt innerhalb eines erlaubten Bereiches oder Musters liegt - sonst kann u.U. nämlich alles mögliche eingebunden werden.

Das einfachste wäre, eine Liste erlaubter Dateien vorzugeben, und dagegen zu prüfen. Damit würde sich dein Problem auch erledigen, weil dann dein Script eine entsprechende Meldung ausgeben kann, anstatt den Zugriff überhaupt zu versuchen.

@bcg: Danke für die Erklärung, jetz hab ichs verstanden. :wink:

@chrisb: Naiv ist ein sehr hartes Wort…Ich würde es eher als simpel oder “wenig professionell” bezeichnen^^
Du hast im Grunde schon recht, allerdings habe ich das Script schon so geschrieben, dass nur PHP-Dateien in einem ganz bestimmten Ordner angesprochen werden können. Ein Missbrauch wird ohne die FTP-Daten kaum möglich sein.

Trotzdem interessiert mich dein Vorschlag, eine Liste mit erlaubten Dateien zu erstellen. Wie könnte sowas aussehen? Ne MySQL tabelle bzw. ne Datei mit den Dateinamen?

Wäre toll wenn du mir n paar Stichwörter geben könntest damit ich mich über Google n bisschen einlesen kann :wink:

Aja, danke nochmal an alle Poster!
:wink:

Die Benutzung einer Liste mit erlaubten Dateien ist relativ einfach. Du erstellst einen Array mit den Dateien:

$files = array(); $files['seite1'] = 'pages/seite1.php'; //usw.
In deiner Seite in der das include() steht, lädst du dann die Datei so:

if(isset($_GET['sid']) AND isset($files[$_GET['sid']])) {
    include $files[$_GET['section']];
  } else {
    include '404.php';
  }

Ach klar auf die Möglichkeit per Array bin ich noch gar nicht gekommen^^

Vielen Dank, so werd ichs wohl machen

oder mit den arrays hätte ichs so gemacht:

<?php $allowed_files = array("datei.php", "datei2.php"/*,...*/); if(in_array($_GET["sid"], $allowed_files) && $_GET["sid"] != "") include("ordner/bzw/pfad/". $_GET["sid"]); else include("errors/404.php"); ?>

mfg Joey
PS: sorry, vlt ist die antwort halt zu spät :wink: