Michael: Header Location als Dereferer ungeeignet?

Hallo,

ich habe mir in PHP ein einfaches Dereferenzierungsscript geschrieben, damit bei externen Links keine sensiblen Header Informationen übergeben werden (Session IDs etc.)

Aufruf: dereferer.php?uri=http://www.abc.de

<?php
if (isset($uri))
{
   header('Location: '.$uri);
   exit;
}
else
{
   die('Fehler: Es wurde keine URI übergeben.');
   exit;
}
?>

Ich habe nun gehört, dass es trotzdem vorkommen kann, dass Header Informationen der vorangegangen Seite (die dereferer.php aufrufen hat) übermittelt werden.

Ist mein Script also unsicher?
Über ein sicheres Dereferer Script wäre ich sehr dankbar...

Den Einsatz von http-refresh und Java Script wollte ich eigentlich vermeiden...

Beste Grüße
Michael

  1. Hallo Michael!

    Ist mein Script also unsicher?

    Ja, und zwar aus mehreren Gründen.

    Aufruf: dereferer.php?uri=http://www.abc.de

    if (isset($uri))

    1. Du gehst davon aus, daß register-globals angeschaltet ist.
    2. Du prüfst gar nicht, ob der Wert von $_GET['uri'] überhaupt ein URI ist.

    Das ist zwar jetzt nicht wirklich das, was Du wissen wolltest, aber trotzdem sind dies 2 Dinge, die du ändern solltest.

    MfG
    Götz

    --
    Losung und Lehrtext für Sonntag, 29. Februar 2004
    Des Herrn Augen schauen alle Lande, dass er stärke, die mit ganzem Herzen bei ihm sind. (2.Chronik 16,9)
    Wie überschwänglich groß ist seine Kraft an uns, die wir glauben, weil die Macht seiner Stärke bei uns wirksam wurde, mit der er in Christus gewirkt hat. (Epheser 1,19-20)
    (http://www.losungen.de/heute.php3)
    1. Hallo Danke für die Antwort,

      also register_globals ist an (hab ich so geregelt...).

      Das Prüfen auf eine URI wollte ich mir ersparen, da es eigentlich nicht relevant ist. Der Nutzer bekommt höchstens eine Fehlermeldung im Browser.

      Die Frage ist aber immer noch, wie es um meine Header Informationen bestellt sind?

      Ist meine Session ID (übergebe ich immer per GET Parameter) evtl. ausspionierbar?

      Gruß
      Michael

      1. Hi,

        also register_globals ist an (hab ich so geregelt...).

        das wird üblicherweise als Mangel betrachtet.

        Das Prüfen auf eine URI wollte ich mir ersparen, da es eigentlich nicht relevant ist.

        Doch, ist es. Du füllst den Wert in einen wichtigen HTTP-Header.

        Der Nutzer bekommt höchstens eine Fehlermeldung im Browser.

        Du kannst nicht wissen, ob es überhaupt einen Nutzer bzw. einen Browser gibt, geschweige denn wie viele Systeme bis dahin passiert wurden-

        Die Frage ist aber immer noch, wie es um meine Header Informationen bestellt sind?

        Unsicher. Vergiss das gleich. Benutze das, was Du vermeiden wolltest - oder lasse noch besser einem Link folgen.

        Ist meine Session ID (übergebe ich immer per GET Parameter) evtl. ausspionierbar?

        Die ID? Ja, sicher. Die Daten dahinter? Das hängt davon ab, welche Zugangsmöglichkeiten Du anbietest - irgendwo im Universum Deiner Site.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Hallo,

          Die Frage ist aber immer noch, wie es um meine Header Informationen bestellt sind?

          Unsicher. Vergiss das gleich. Benutze das, was Du vermeiden wolltest - oder lasse noch besser einem Link folgen.

          Also können bei meiner Variante die Header Informationen (u.a. Get Parameter) der rufenden Seite ausgelesen werden? Das ist blöd.
          Nur nochmal schnell zum Verständnis:

          -> die Seite memberbereich.php?PHPSESSID=************************ enthält einen Link <a href="dereferer.php?uri=http//www.abc.de" target="_blank">Link extern</a>
          -> dann springt ein neues Fenster auf in dem die Seite geladen wird (siehe Code im ersten Thread von mir)

          Wie kann es sein, dass die Seite www.abc.de die PHPSESSID aus dem header bekommen kann.... ich habe doch über die dereferer.php umgeleitet? Nur von der dürften doch die Header Informationen verfügbar sein, die mir ja egal sind...

          Und wenn ich nun einen extra Link zum anklicken machen oder einen refresh nehme, ist das Problem gelöst?

          Kann mir das jemand genauer erklären, oder wo liegen die Probleme bei meiner Variante liegen? Im Netz findet man fast nix genaues zu dem Thema...bzw. alle machen es so wie ich...

          Beste Grüße
          Michael

          1. Hallo Michael,

            Und wenn ich nun einen extra Link zum anklicken machen oder einen refresh nehme, ist das Problem gelöst?

            Ja.

            Kann mir das jemand genauer erklären, oder wo liegen die Probleme bei meiner Variante liegen?

            Wenn Du eine HTTP-Weiterleitung, dann ändert der Browser den Referer beim Zugriff auf die Seite, auf die weitergeleitet wurde, nicht (der Browser hat ja die 'Seite', die die Weiterleitung ausgegeben hat, gar nicht wirklich geladen!). Wenn Du dagegen einen Link oder so etwas hast, dann hat der Browser eine Seite dazwischen geladen, die als neuer Referer dient.

            Btw: Probier es doch selbst aus:

            -------------------------- redirect.php
            <?php

            if (isset ($_GET['uri'])) {
                    Header ('Location: ' . $_GET['uri']);
                    exit;
            }

            ?>
            <a href="<?php echo $_SERVER['PHP_SELF']; ?>?uri=<?php echo urlencode('http://localhost/info.php'); ?>">Link</a>
            -------------------------

            -------------------------- info.php
            <?php phpinfo (); ?>
            -------------------------

            Nun such nach der Umgebungsvariable HTTP_REFERER und Du wirst fündig. Und diese enthält den *alten* Referer und nicht den der Weiterleitungsseite!

            Viele Grüße,
            Christian