Christian: mehrere Dateien immer im Frameset öffnen

hallo in die runde,

eigentlich hatte ich das thema frames schon abgeschlossen, nun muss ich da doch noch mal ran. diese stehen also nicht in frage.

mein problem ist, dass das öffnen einer datei immer im frameset erfolgen soll. dazu habe ich mir mal folgenden code zusammengeschrieben:
im frameset (index.php):
<?PHP
 if($oe == "") {
  $oe = "index2.php"; }
 else {
  $oe = stripslashes($oe); }
?>
<frameset>
<frame src="../head.html" />
<frame src="<?php echo "$oe"; ?>?id=ok" />
</frameset>

in index2.php
<?php
if ($id != "ok") {
 $pfad = "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/";
 header("location:$pfad");
 }
?>

nun meine fragen:
1. gibt es gegen diesen code irgendwelche einwände? ich bin leider kein experte auf diesem gebiet, habe mich deshalb etwas in diversen foren umgesehen und herausgefunden, dass es mit der übergabe einer variablen funktionieren könnte. bei mir klappts, nur wollte ich dazu gern noch eine expertenmeinung einholen.

2. das problem, dass sich mir jetzt im anschluss stellt, ist, wie mache ich diesen code für mehrere dateien tauglich, die in das frameset geladen werden könnten, z.b. eine index3.php. da im frameset oben ja die index2.php angegeben ist, müßte man also den dateinamen der aufgerufenen datei irgendwie in das frameset übergeben. geht so etwas?

danke für die unterstützung!

C.

  1. Hi,

    1. gibt es gegen diesen code irgendwelche einwände? ich bin leider kein experte auf diesem gebiet, habe mich deshalb etwas in diversen foren umgesehen und herausgefunden, dass es mit der übergabe einer variablen funktionieren könnte. bei mir klappts, nur wollte ich dazu gern noch eine expertenmeinung einholen.

    ich möchte mich zwar nicht als Experten bezeichnen, sehe jedoch trotzdem Probleme in dem Code:

    if($oe == "") {

    [...]

    if ($id != "ok") {

    1. Du scheinst hier von der Einstellung register_globals = on Gebrauch zu machen, was keine gute Entscheidung ist (siehe http://de3.php.net/manual/de/security.registerglobals.php). Benutze statt dessen lieber die Superglobalen Arrays $_GET, $_POST, $_COOKIE oder $_REQUEST.

    2. ...und wesentlich schlimmer:

    $oe = stripslashes($oe); }

    hier übernimmst du den Parameter, der in der Adresszeile steht, ohne Prüfung. Was hindert mich daran, deine index.php mit dem Parameter oe aufzurufen und ein wenig zu probieren. Z.B.:

    index.php?oe=geheim/passwoerter.txt

    Bei einem schlecht konfigurierten Webserver könnte man vermutlich sogar Dateien aus dem Dateisystem auslesen, indem man ein paar Ebenen runtergeht:

    index.php?oe=../../../beliebigesverzeichnis/beliebigedatei

    Um das zu verhindern, solltest du dir mal die Funktion basename() ansehen (http://de3.php.net/manual/de/function.basename.php), also z.B. in der index.php:

    if (isset($_GET['oe'])) {

    $oe = basename($_GET['oe']);

    } else {

    $oe = "index2.php";

    }

    Wenn du dann

    <frame src="<?php echo $oe; ?>?id=ok" />

    benutzt, sorgt dies dafür, dass in obigen Beispielen jeweils nur auf das Verzeichnis, welches du für die öffentlichen Dateien vorgesehen hast (in diesem Fall also das, in dem auch die index.php liegt), zugegriffen werden kann. Zusätzlich könntest du soger noch mittels file_exists(basename($_GET['oe'])) (http://de3.php.net/manual/de/function.file-exists.php) abfragen, ob die gewünschte Datei überhaupt existiert - wenn nicht, kannst du eine eigene Fehlermeldung ausgeben.

    1. das problem, dass sich mir jetzt im anschluss stellt, ist, wie mache ich diesen code für mehrere dateien tauglich, die in das frameset geladen werden könnten, z.b. eine index3.php. da im frameset oben ja die index2.php angegeben ist, müßte man also den dateinamen der aufgerufenen datei irgendwie in das frameset übergeben. geht so etwas?

    Das müsste doch schon gehen - du rufst die index.php einfach mit dem Parameter ?oe=index3.php auf...

    Gruß,
    Andreas.

    1. Hallo Andreas,

      vielen dank für die Tips, war genau das, was ich von einem Experten erwartet habe (auch wenn du so bescheiden warst, dich nicht so zu bezeichnen ;-) ).
      Klare Ausführung mit umfangreicher Begründung. Würde ich mir hir öfters wünschen.

      vielen Dank

      C.