Rod: Zum Thema Seesion ID

Hi,

ich möchte gerne beim Login in meine Seite eine Session ID generieren und diese soll den Besucher quasi durch meine Seite begleiten.

Wird irgendeine Seite ohne Session ID aufgerufen, soll der Gast autom. zum Login kommen.

Klappt auch ganz gut, ich übergebe mit jedem Link die Session ID, die ich beim Login erstellt habe.

session_start();
$sessionid=session_id();
session_register( "UserName" );

<A HREF="link.php?SESSID=$sessionid>Link</A>

Ich weiß, normalerweise braucht man die SeeionID nicht extra in die Variable zu packen, hat aber anders nicht geklappt, warum auch immer...

So, kommt der Gast nun auf die Link-Seite, gehts so weiter:

if ($SESSID=="") {
    header("Location: login.php");
    exit;
  }

session_start();
   $sessionid=session_id();

Klappt prima, aber:

Wenn ich den Link direkt eingebe und denke mir eine Session ID selber aus, also z.B. : www.meiseSeite.de/link.php?SESSID=12345, dann werde ich nicht zum Login geleitet :-(

Warum? Und wie kann ich das besser machen?

Grüße

Rod

  1. hi,

    if ($SESSID=="") {
        header("Location: login.php");

    Klappt prima, aber:

    ist aber falsch. eine umleitung per location-header erfordert einen vollständigen URL, also http://...

    Wenn ich den Link direkt eingebe und denke mir eine Session ID selber aus, also z.B. : www.meiseSeite.de/link.php?SESSID=12345, dann werde ich nicht zum Login geleitet :-(

    Warum?

    die frage ist doch nicht dein ersnt, oder?

    du fragst ab, ob $SESSID=="" ist.
    wenn du eine beliebige $SESSID an den URL anhängst, ist das doch wohl kaum noch der fall.

    Und wie kann ich das besser machen?

    prüfe nicht nur, ob eine session-id übergeben wurde - sondern auch, ob sie zu einer aktuelle _gütligen_ session gehört.

    gruss,
    wahsaga

    1. Hi Wasaga,

      dank für die Antwort :-)

      die frage ist doch nicht dein ersnt, oder?

      Klar, hast Recht.

      prüfe nicht nur, ob eine session-id übergeben wurde - sondern auch, ob sie zu einer aktuelle _gütligen_ session gehört.

      Genau, das wäre mein nächstes Problem geworden.

      Danke

      Rod

      gruss,
      wahsaga

  2. Moin!

    ich möchte gerne beim Login in meine Seite eine Session ID generieren und diese soll den Besucher quasi durch meine Seite begleiten.

    PHP hat dazu einen wunderbaren Session-Mechanismus geschaffen.

    Wird irgendeine Seite ohne Session ID aufgerufen, soll der Gast autom. zum Login kommen.

    Falscher Ansatz: Wenn eine Seite ohne _Login_ aufgerufen wird, _dann_ soll man zum Login gelangen. Den Status "eingeloggt" schreibst du in deine Session-Daten.

    Klappt auch ganz gut, ich übergebe mit jedem Link die Session ID, die ich beim Login erstellt habe.

    session_start();
    $sessionid=session_id();
    session_register( "UserName" );

    <A HREF="link.php?SESSID=$sessionid>Link</A>

    Wahnsinnig umständlich. Und veraltet.

    Punkt 1: PHP liefert dir die Konstante "SID", welche Session-Name plus Session-ID enthält, sofern der aktuelle Seitenrequest nicht per Cookie diese Daten geliefert hat (wenn Sessions per Cookie möglich sind, ist SID leer).

    Verwende also bitte diese Konstante:

    echo "<a href="link.php?".SID."">Link</a>";

    Punkt 2: Seit PHP 4.1 gibt es die superglobale Variable $_SESSION, in die man Werte einspeichern soll, die per Session auf jeder folgenden Seite wieder erscheinen sollen. session_register() soll nicht mehr verwendet werden.

    Ich weiß, normalerweise braucht man die SeeionID nicht extra in die Variable zu packen, hat aber anders nicht geklappt, warum auch immer...

    Das ist aber genau der Punkt: Wenn irgendwas nicht geht - warum geht es nicht.

    So, kommt der Gast nun auf die Link-Seite, gehts so weiter:

    if ($SESSID=="") {

    Das hier ist aus zwei Gründen problematisch.

    Erstens: Wenn $SESSID als Variable nicht existiert, kriegst du an dieser Stelle eine "Notice", dass du eine undefinierte Variable abfragst. Ja, das kann man abschalten in der PHP-Konfiguration, aber es ist unsauber programmiert.

    Zweitens: Du verläßt dich auf das Eingeschaltetsein von register_globals. Das wird aber bei künftigen Servern und PHP-Versionen immer weniger der Fall sein. Verwende die superglobalen Variablen $_GET und $_POST (beide seit PHP 4.1 verfügbar), um auf Werte, die der Browser als URL-Parameter oder POST-Formularwert sendet, zuzugreifen.

    Also lieber so:

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

    header("Location: login.php");

    Weiterleitungen müssen immer eine absolute URL enthalten, beginnend mit "http://". Der HTTP-Standard schreibt es zwingend vor.

    exit;
      }

    session_start();
       $sessionid=session_id();

    Unglücklich, dass du zuerst die Session startest und dann die Session-ID setzt. Das wird zu Konflikten führen. Umgekehrt wäre grundsätzlich besser - aber dein Ansatz ist ohnehin schlecht, also lass es gleich wieder.

    Klappt prima, aber:

    Tja, immer diese "aber"s.

    Wenn ich den Link direkt eingebe und denke mir eine Session ID selber aus, also z.B. : www.meiseSeite.de/link.php?SESSID=12345, dann werde ich nicht zum Login geleitet :-(

    Logisch. Du fragst ab, ob die Variable $SESSID leer ist. Das ist der Fall, wenn du sie (bei register_globals=on) _nicht_ als URL-Parameter angibst, oder wenn du sie so angibst: "?SESSID=".

    Alles andere wird als "nichtleer" bewertet, und du kommst nicht zum Login.

    Deswegen ja mein Vorschlag: Schau in den _Sessiondaten_ nach, ob der Benutzer sich schon mal eingeloggt hat. Wenn nein: Redirect zum Login.

    Dann mußt du dir auch keinerlei Gedanken mehr um die Session-ID machen. Die ist einfach da und sorgt dafür, dass der nächste Request eines Besuchers dieselben Session-Daten lädt. Ansonsten ist die Session-ID-Verwaltung etc. absolut uninteressant für dich.

    Ach ja: Es wäre nicht schlecht, wenn du in die Session-Daten auch noch das aktuelle Datum und Uhrzeit reinschreibst, wenn der Zugriff erlaubt war (also angemeldeter Benutzer etc.). Dann kannst du nämlich am Anfang nicht nur prüfen, ob der Benutzer eingeloggt war, sondern auch, ob er nicht schon zu lange keine Anfrage mehr gestartet hat. Vergessenes Logout ist nämlich auch nicht gut.

    - Sven Rautenberg

    --
    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
    1. Hi Sven,

      auch erstmal danke für diese supoer Antwort.

      Falscher Ansatz: Wenn eine Seite ohne _Login_ aufgerufen wird, _dann_ soll man zum Login gelangen. Den Status "eingeloggt" schreibst du in deine Session-Daten.

      Gut, mache ich. Komme weiter unten noch auf die Frage, wie denn? zurück :-) Weil die Idee mit dem "nicht ausgeloggt" hatte ioch auch schon, nur meine Lösung wäre sehr umständlich geworden. 'Bin halt nioch nicht so ein doller Programmierer, freue mich aber über eine so prima Unterstützung! :-)

      Wahnsinnig umständlich. Und veraltet.

      Aha :-(

      Punkt 1: PHP liefert dir die Konstante "SID", welche Session-Name plus Session-ID enthält, sofern der aktuelle Seitenrequest nicht per Cookie diese Daten geliefert hat (wenn Sessions per Cookie möglich sind, ist SID leer).

      Weiß ich ja, aber mit SID hat auf keine Art geklappt, die ich versucht hatte und ich hab keinen Schimmer, warum nicht.

      Verwende also bitte diese Konstante:

      echo "<a href="link.php?".SID."">Link</a>";

      Mach ich und melde mich, wenns wieder nicht funtzt :-)

      Punkt 2: Seit PHP 4.1 gibt es die superglobale Variable $_SESSION, in die man Werte einspeichern soll, die per Session auf jeder folgenden Seite wieder erscheinen sollen. session_register() soll nicht mehr verwendet werden.

      Ok. Verwende ich nicht mehr. Wie bitte schreibt man denn in die $_SESSION die Daten rein?

      Das ist aber genau der Punkt: Wenn irgendwas nicht geht - warum geht es nicht.

      Sehe ich ja genauso, nur ich hab Tage mit der SID verbracht und irgendwann war ich schlichtweg entnervt :-(

      So, kommt der Gast nun auf die Link-Seite, gehts so weiter:

      if ($SESSID=="") {

      Das hier ist aus zwei Gründen problematisch.

      Also lieber so:

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

      Aha :-)

      Weiterleitungen müssen immer eine absolute URL enthalten, beginnend mit "http://". Der HTTP-Standard schreibt es zwingend vor.

      Kann ich mich gerne dran halten, ich wußte es nur nicht :-)

      Deswegen ja mein Vorschlag: Schau in den _Sessiondaten_ nach, ob der Benutzer sich schon mal eingeloggt hat. Wenn nein: Redirect zum Login.
      Ach ja: Es wäre nicht schlecht, wenn du in die Session-Daten auch noch das aktuelle Datum und Uhrzeit reinschreibst, wenn der Zugriff erlaubt war (also angemeldeter Benutzer etc.). Dann kannst du nämlich am Anfang nicht nur prüfen, ob der Benutzer eingeloggt war, sondern auch, ob er nicht schon zu lange keine Anfrage mehr gestartet hat. Vergessenes Logout ist nämlich auch nicht gut.

      Jups, und genau hier weiß ich nicht, wie. Ich werde mal im Netz stöbern gehen, ansonsten wäre weitere Hilfe nochmal nett.

      Danke bis hierhin schonmal

      Rod

      1. hi,

        Punkt 2: Seit PHP 4.1 gibt es die superglobale Variable $_SESSION, in die man Werte einspeichern soll, die per Session auf jeder folgenden Seite wieder erscheinen sollen. session_register() soll nicht mehr verwendet werden.

        Ok. Verwende ich nicht mehr. Wie bitte schreibt man denn in die $_SESSION die Daten rein?

        ganz einfach:
        $_SESSION['indexname'] = "wert";

        später dann wieder über $_SESSION['indexname'] abrufbar.

        einfach am anfang jedes scriptes session_start() aufrufen, und anschliessend mit $_SESSION[] arbeiten, so wie mit sonstigen arrays auch.

        http://www.php.net/manual/de/function.session-start.php
        http://www.php.net/manual/de/ref.session.php
        geben dir weitere auskünfte und beispiele.

        gruss,
        wahsaga

        1. einfach am anfang jedes scriptes session_start() aufrufen, und anschliessend mit $_SESSION[] arbeiten, so wie mit sonstigen arrays auch.

          Hi Wahsaga,

          danke! Ist ja anscheinend gar nicht schwer :-)

          Noch ne Frage:

          Wenn ich über dieses Testscript<?

          $sessionid=session_id();
          session_start();
          echo "<a href="link.php?".SID."">Link</a>";

          die SID weitergebe, ist sie in der URLzeile drin, prima. Aber wenn ich die Cookies meines Browsers ausgeschaltet habe, taucht die SID gleich 2 mal hintereinander auf :-(
          Eigendlich möchte ich schon, daß die SID in der URL-Zeile drin steht, aber nicht unbedingt gleich 2 mal :-(

          Grüße

          Rod

        2. einfach am anfang jedes scriptes session_start() aufrufen, und anschliessend mit $_SESSION[] arbeiten, so wie mit sonstigen arrays auch.

          Hi Wahsaga,

          danke ! :-)

          Noch ne Frage: Wemnn ich über folgendes Script
          session_start();
          echo "<a href="link.php?".SID."">Link</a>";
          eine SID weitergebe, ist die SID in der URL-Zeile zu sehen, so möchte ich das auch.

          Wenn ich im Browser aber die Cooies ausgeschaltet habe, ist die SID gleich 2 mal hintereinander in der URL-Zeile zu sehen, das möchte ich ansich nicht...

          Grüße

          Rod

          1. Moin!

            Noch ne Frage: Wemnn ich über folgendes Script
            session_start();
            echo "<a href="link.php?".SID."">Link</a>";
            eine SID weitergebe, ist die SID in der URL-Zeile zu sehen, so möchte ich das auch.

            Wenn ich im Browser aber die Cooies ausgeschaltet habe, ist die SID gleich 2 mal hintereinander in der URL-Zeile zu sehen, das möchte ich ansich nicht...

            Scheinbar ist bei deinem Server trans_sid aktiv. Dann schreibt der Server am Ende, wenn dein Skript die Seite generiert hat, hinter alle Links und in alle Formulare noch die Session-ID rein, sofern kein Cookie empfangen wurde.

            Mit anderen Worten: Du kannst dir das reinschreiben der Session-ID in den meisten Fällen sparen.

            Aber eben nicht in allen Fällen. Weiterleitungen mit header() sind davon nicht betroffen (da muß SID also rein), und Meta-Refreshes erkennt PHP auch nicht. Ebenso hat PHP keine Ahnung von URLs, die mit Javascript erzeugt/aufgerufen werden.

            Deshalb (und weil trans_sid Performance kostet) ist es schlauer, entweder nur auf Cookies zu setzen, oder manuell überall die Session-ID reinzubauen und trans_sid vielleicht ganz auszuschalten.

            - Sven Rautenberg

            --
            "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
            (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
            1. Scheinbar ist bei deinem Server trans_sid aktiv. Dann schreibt der Server am Ende, wenn dein Skript die Seite generiert hat, hinter alle Links und in alle Formulare noch die Session-ID rein, sofern kein Cookie empfangen wurde.

              Hm, kann ich die Weitergabe über Cookies eigendlich verhindern?

              Und: Ist es schlimm, wenn die SID 2 mal in der URL-Zeile auftaucht?

              Grüße

              Rod

              1. Moin!

                Hm, kann ich die Weitergabe über Cookies eigendlich verhindern?

                Cookies sind dein Freund. Denn sie verhindern, dass unabsichtlich deine Session-IDs an fremde Server gelangen. Möglichkeiten dazu gibt es genug: Referrer, Copy&Paste des Besuchers etc. Wer die Session-ID kennt, hat in diesem Augenblick Zugriff auf den Server und den angemeldeten Account.

                Und: Ist es schlimm, wenn die SID 2 mal in der URL-Zeile auftaucht?

                Nein, nicht wirklich. Sieht nur doof aus, mehr nicht.

                - Sven Rautenberg

                --
                "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
                (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
                1. Cookies sind dein Freund.

                  Ist wahr? Wird das denn gelöscht, sobald die Session beendet wird?

                  Und: Ist es schlimm, wenn die SID 2 mal in der URL-Zeile auftaucht?

                  Nein, nicht wirklich. Sieht nur doof aus, mehr nicht.

                  Sogar ausgesprochen doof! Kann ich das nicht irgendwie verhindern?

                  Grüße

                  Rod

                  - Sven Rautenberg

                  1. hi,

                    Cookies sind dein Freund.

                    Ist wahr? Wird das denn gelöscht, sobald die Session beendet wird?

                    die von PHP gesetzten session cookies werden m.W. standardmässig in dem augenblick verworfen, wo du das browserfenster schliesst.

                    gruss,
                    wahsaga

                  2. Moin!

                    Cookies sind dein Freund.

                    Ist wahr? Wird das denn gelöscht, sobald die Session beendet wird?

                    Löse dich vom Gedanken, dass du das Ende der Session irgendwie bestimmen könntest. Das kannst du nicht.

                    Jeder, der deinen Server vom groben Mechanismus her kennt (da reicht ein einziger Request), sieht sofort, dass du Sessions verwendest. Das bedeutet: Er kann problemlos eine _beliebige_ Session-ID erzwingen, indem er einfach in der URL die passenden Parameter angibt.

                    Daraus folgt: Die Tatsache, dass jemand eine Session-ID hat, besagt gar nichts. Sie sorgt lediglich dafür, dass die zugeordneten Session-Daten in $_SESSION gepackt werden.

                    Natürlich könnte man auf diese Weise ein wenig ID-Raten betreiben. Allerdings ist die standardmäßige ID 128 Bit lang (als Hex-Zahl 32 Zeichen). Der Wertebereich ist so groß, dass man eher 6 Richtige im Lotto hat, als einmal richtig zu raten.

                    Das einzige, was du eben tun solltest, um die Sicherheit dadurch zu erhöhen, dass man eine einmal eröffnete Session nicht nach endlos langer Zeit neu aufrufen kann, ist die Sache mit dem Zeitvergleich _innerhalb der Session_. PHP räumt zwar auch recht grob alte Session-Daten weg, aber das kann dir niemand garantieren, und darauf solltest du dich auch nicht verlassen. Und zweitens solltest du die in der Session enthaltenen Daten löschen, sobald du feststellst, dass der Benutzer sich ausloggen will oder die Session abgelaufen ist, aber noch ein Zugriff erfolgt. $_SESSION=array() löscht dir alle Daten. Damit wird dann auch in der Session-Datei auf dem Server, die die Daten zwischenspeichert, nichts mehr zu lesen sein.

                    Sogar ausgesprochen doof! Kann ich das nicht irgendwie verhindern?

                    Teste, ob diese trans_sid-Option gesetzt ist. Wenn ja, verzichte auf die SID-Angabe, wenn nein, setze sie hinein.

                    Du kannst dir damit behelfen, dass du nur einmal zu Beginn diese Prüfung machst und je nach Ergebnis eine Konstante mySID so definierst, dass sie entweder leer ist (trans_sid ein) oder SID enthält (trans_sid aus). Diese Konstante packst du dann in deine Links hinein.

                    http://de2.php.net/manual/de/ref.session.php

                    - Sven Rautenberg

                    --
                    "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
                    (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
                    1. Hi Sven,

                      und wieder jede Menge gelernt :-)

                      Eins hab ich aber nicht verstanden:

                      Daraus folgt: Die Tatsache, dass jemand eine Session-ID hat, besagt gar nichts. Sie sorgt lediglich dafür, dass die zugeordneten Session-Daten in $_SESSION gepackt werden.

                      Natürlich könnte man auf diese Weise ein wenig ID-Raten betreiben. Allerdings ist die standardmäßige ID 128 Bit lang (als Hex-Zahl 32 Zeichen). Der Wertebereich ist so groß, dass man eher 6 Richtige im Lotto hat, als einmal richtig zu raten.

                      Wenn jemand eine Sessin-ID hat von einer Session, die eigendlich bereits beendet war, bei der aber das Array nicht auf leer gesetzt wurde, kann der "neue" Besitzer des SessionID dann nicht einfach so weiterarbeiten. als wäre die Sitzung nie beendet worden?

                      Sogar ausgesprochen doof! Kann ich das nicht irgendwie verhindern?

                      Teste, ob diese trans_sid-Option gesetzt ist. Wenn ja, verzichte auf die SID-Angabe, wenn nein, setze sie hinein.

                      Du kannst dir damit behelfen, dass du nur einmal zu Beginn diese Prüfung machst und je nach Ergebnis eine Konstante mySID so definierst, dass sie entweder leer ist (trans_sid ein) oder SID enthält (trans_sid aus). Diese Konstante packst du dann in deine Links hinein.

                      Gute Idee. Mal ne Frage: Kann  ich diese ganzen Routinearbeiten zu Beginn jedes Scriptes nicht einfach auslagern unn dann zu Begin jedesn Scriptes irgendwie includen?

                      Grüße

                      Rod

                      http://de2.php.net/manual/de/ref.session.php

                      - Sven Rautenberg

                      1. Moin!

                        Eins hab ich aber nicht verstanden:

                        Wenn jemand eine Sessin-ID hat von einer Session, die eigendlich bereits beendet war, bei der aber das Array nicht auf leer gesetzt wurde, kann der "neue" Besitzer des SessionID dann nicht einfach so weiterarbeiten. als wäre die Sitzung nie beendet worden?

                        Richtig. Das ist genau das Problem. Das ist aber genauso ein Problem, wenn jemand Username und Passwort kennt. Dann kann er genauso "einfach weiterarbeiten".

                        Session-IDs haben den Vorteil, dass sie zwar wie ein "Ersatzschlüssel" wirken, also anstatt Username und Passwort den Zugang gewähren, aber immer nur relativ kurzfristig gültig sind. Man kann sie zwar grundsätzlich relativ leicht selbst bilden, aber eine gültige Session zu raten, ist sehr schwer. Dagegen eine Username/Passwort-Kombination zu raten ist bei weitem nicht so schwer. Denn das hat sich wahrscheinlich ein Mensch ausgedacht, und Menschen sind faul und einfallslos, so dass nicht alle Möglichkeiten statistisch gleichverteilt sind, sondern gewisse Passwörter wahrscheinlicher sind. Außerdem sind solche Daten weitaus länger gültig, als eine Session-ID.

                        Es geht hier immer um die Gewinnung zusätzlicher Sicherheit. Wenn eine Session eine gewisse Zeit lang nicht benutzt wird, dann gibt es irgendwo einen Computer, der die Session-ID legal gekriegt hat. Warum meldet der sich nicht mehr? Vielleicht ist sein User in der Mittagspause. Vielleicht kommt jemand Fremdes herein und benutzt den Rechner unerlaubt.

                        Wenn du nach einem Logout und nach einem Timeout das Session-Array leerst, kann in dieser Hinsicht nichts passieren, denn die Session beginnt, egal ob vorher verwendet oder nicht, wie neu.

                        Gute Idee. Mal ne Frage: Kann  ich diese ganzen Routinearbeiten zu Beginn jedes Scriptes nicht einfach auslagern unn dann zu Begin jedesn Scriptes irgendwie includen?

                        Ja klar, sowas geht.

                        - Sven Rautenberg

                        --
                        "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
                        (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
                        1. Moin!

                          Eins hab ich aber nicht verstanden:

                          Hi Sven,

                          alles klar, das hab ich nun verstanden. Deshalb werde ich auf jeden Fall das array leeren, wenn die Sesion als beendet gilt.

                          Gute Idee. Mal ne Frage: Kann  ich diese ganzen Routinearbeiten zu Beginn jedes Scriptes nicht einfach auslagern unn dann zu Begin jedesn Scriptes irgendwie includen?

                          Ja klar, sowas geht.

                          Hm, ich frag deshalb, weil ich das mal versucht habe, in einen Header zu packen und irgendwie nicht wirklich damit weiterkam.

                          Ich versuch das nochmal, gibt es denn irgendwas zu beachten oder kann ich von session_start(); bis "weißichwohin" alles in diesen Header reinpacken?

                          Grüße

                          Rod

                          1. Moin!

                            Hm, ich frag deshalb, weil ich das mal versucht habe, in einen Header zu packen und irgendwie nicht wirklich damit weiterkam.

                            Ich versuch das nochmal, gibt es denn irgendwas zu beachten oder kann ich von session_start(); bis "weißichwohin" alles in diesen Header reinpacken?

                            session_start() versucht immer, ein Cookie zu senden. Ein Cookie kann nur gesendet werden, wenn man noch HTTP-Header setzen kann. HTTP-Header kann man nur setzen, wenn diese noch nicht abgeschickt wurden. Diese werden abgeschickt, sobald die erste Textausgabe für die HTML-Seite gemacht wird.

                            Das bedeutet: Jegliches echo oder print vor session_start() ist zu vermeiden, ebenso jegliches Textzeichen (Leerzeichen, Leerzeile) vor dem ersten "<?php"

                            Die Datei muß direkt in Zeile 1 mit <?php beginnen, ansonsten wird das davor befindliche Zeichen als Teil der HTML-Seite ausgegeben, was die Header abschickt.

                            - Sven Rautenberg

                            --
                            "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
                            (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
                            1. Die Datei muß direkt in Zeile 1 mit <?php beginnen, ansonsten wird das davor befindliche Zeichen als Teil der HTML-Seite ausgegeben, was die Header abschickt.

                              - Sven Rautenberg

                              Genau darauf wollte ich hinaus.

                              Danke für die genaue Erklärung :-)

                              Rod

            2. hi,

              Aber eben nicht in allen Fällen. Weiterleitungen mit header() sind davon nicht betroffen (da muß SID also rein), und Meta-Refreshes erkennt PHP auch nicht. Ebenso hat PHP keine Ahnung von URLs, die mit Javascript erzeugt/aufgerufen werden.

              das liesse sich eventuell noch durch eine erweiterung der konfigurations-option url_rewriter.tags bewerkstelligen - dies gibt an, an welchen stellen php nach URLs suchen soll, an die die SID angehängt werden muss.

              (für wirklich sinnvoll halte ich es hier aber nicht.)

              gruss,
              wahsaga

        3. Hello,

          session_start();
          if (strlen(SID)>0)
          {
            ## Session ist neu gestartet worden
            ## User kann also noch nicht logged sein

          if (login())
            {
              $_SESSION["log_cookie"] = zufallswert();
              setcookie("pin",$_SESSION["log_cookie"]);
            }
          }
          else
          {
            if ($_COOKIE["pin"] == $_SESSION["log_cookie"])
            {
              ## User ist logged

          }
            else
            {
              ## User ist nicht logged
            }
          }

          So ungefähr funktioniert das Doppelschlüsselverfahren zum Login.

          Den Login-teil sollte man aber immer vom Session-Teil getrennt betrachten und aufbauen. Denn nicht jeder Besucher wird sich anmelden wollen, aber bei vielen sit es interessant, sie intelligent durch die Website zu führen.

          Grüße

          Tom

          1. Moin!

            if (strlen(SID)>0)
            {
              if (login())
              {
                $_SESSION["log_cookie"] = zufallswert();
                setcookie("pin",$_SESSION["log_cookie"]);
              }
            }
            else
            {
              if ($_COOKIE["pin"] == $_SESSION["log_cookie"])
              {
              }
              else
              {
              }
            }

            So ungefähr funktioniert das Doppelschlüsselverfahren zum Login.

            Und was _bringt_ das qualitativ? Nichts!

            Du erhöhst lediglich den Rateaufwand etwas - abhängig davon, wie gut dein "zufallswert()" ist, und wie lang.

            Aber rein technisch gesehen muß der Client immer noch die richtige Session-ID plus die richtige PIN senden - zusammengesetzt also exakt _eine_ richtige Information, welche du dann prüfst.

            Wem der Rateaufwand bei 128-Bit-SessionIDs nicht zu groß ist, weil er die Datenkommunikation belauschen kann, die zwischen dem erlaubt eingeloggten Client und dem Server ausgetauscht wird, der kann dann auch mal eben das zweite Cookie nachmachen.

            Und der Rateaufwand wird von mehreren Billionen Jahren auf mehrere Billionen Billionen Jahre verlängert, vermutlich bis über das Ende des existierenden Universums hinaus.

            Dann wäre es aber einfacher, einfach die Session-ID gleich direkt zu verlängern:

            session_id() = zufallswert()+alte_session_id();
            session_start();

            Und schon hat man tolle lange Session-IDs und keinen unsinnigen Extraaufwand für die Absicherung des nicht Absicherbaren.

            Den Login-teil sollte man aber immer vom Session-Teil getrennt betrachten und aufbauen. Denn nicht jeder Besucher wird sich anmelden wollen, aber bei vielen sit es interessant, sie intelligent durch die Website zu führen.

            Der Session-Teil ist ohnehin irrelevant. Eine Session-ID mitzuschleppen ist programmtechnisch keinerlei Aufwand. Man kann sich also ausschließlich auf den Login-Vorgang konzentrieren.

            - Sven Rautenberg

            --
            "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
            (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
      2. Moin!

        Deswegen ja mein Vorschlag: Schau in den _Sessiondaten_ nach, ob der Benutzer sich schon mal eingeloggt hat. Wenn nein: Redirect zum Login.
        Ach ja: Es wäre nicht schlecht, wenn du in die Session-Daten auch noch das aktuelle Datum und Uhrzeit reinschreibst, wenn der Zugriff erlaubt war (also angemeldeter Benutzer etc.). Dann kannst du nämlich am Anfang nicht nur prüfen, ob der Benutzer eingeloggt war, sondern auch, ob er nicht schon zu lange keine Anfrage mehr gestartet hat. Vergessenes Logout ist nämlich auch nicht gut.

        Jups, und genau hier weiß ich nicht, wie. Ich werde mal im Netz stöbern gehen, ansonsten wäre weitere Hilfe nochmal nett.

        Die Sache ist simpel:

        session_start();

        if (isset($_SESSION['logstatus']) && ($_SESSION['logstatus']=='eingeloggt') && $_SESSION['accesstime'] > time()-30*60)
        {
          //User ist eingeloggt, und der Zeitstempel des letzten Zugriffs ist noch nicht älter als 30 Minuten (= 30*60 Sekunden)

        // Gleich Zeitstempel aktualisieren, damit die Session weitergehen kann.
         $_SESSION['accesstime'] = time();

        ...
        }
        else
        {
          // zum Login gehen
        }

        Es ist schlauerweise vielleicht ganz gut, wenn du die IF-Logik umdrehst und die Bedingung verneinst, den "Zum Login"-Teil damit in den IF-Bereich packst, ihn mit exit(), beendest und auf den else-Teil dann verzichtest. Dahin kommt man dann nur, wenn man eingeloggt und nicht zu lange inaktiv war - und du vermeidest so ewig lange if-Blöcke. Sie sind nämlich auch recht unübersichtlich.

        Zweiter Tipp: Im Prinzip könnte man sich auf jeder Seite einloggen. Dazu müßtest du nur bei abgelaufenen Logins (oder bei nichtvorhandenen) einfach eine Login-Seite ausgeben, die sich an sich selbst schickt.

        Als Prüfung auf jeder Seite checkst du zuerst mal, ob Logindaten geschickt wurden. Wenn das der Fall ist, prüfst du die in deiner Datenbank. Wenn diese Daten gültig sind, setzt du den Login-Status und den Zeitstempel. Dann kommt die Abfrage von oben, ob jemand eingeloggt ist...

        Die Session mußt du dafür ganz am Beginn des Skriptes starten, damit du zum passenden Zeitpunkt nach der Authentifizierung die Session-Daten schon befüllen kannst.

        Weil das Login-Formular sich an sich selbst schickt, also zu exakt der Seite, die angezeigt werden soll, kommt man ohne weitere Navigation nach erfolgtem Login dort an, wo man hinwollte. Man kann also problemlos auf schon besuchte Seiten ein Bookmark setzen und wird ggf. dann eben direkt nach einem Passwort gefragt und kommt nach dessen Eingabe direkt zur gewünschten Seite.

        - Sven Rautenberg

        --
        "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
        (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
        1. Die Sache ist simpel:

          Ja ja, wenn ichs so lese, sieht es tatsächlich so aus :-)

          Es ist schlauerweise vielleicht ganz gut, wenn du die IF-Logik umdrehst und die Bedingung verneinst,

          Jups, sehe ich genauso, werde ich auch machen, danke!

          Zweiter Tipp: Im Prinzip könnte man sich auf jeder Seite einloggen. Dazu müßtest du nur bei abgelaufenen Logins (oder bei nichtvorhandenen) einfach eine Login-Seite ausgeben, die sich an sich selbst schickt.

          Korrekt, aber muß nicht, der Gang zur Login-Seite ist schon ok.

          Jedenfalls sauber, wie Ihr mir hier unter die Arme grift, danke!

          Rod

          1. Hallo,

            Ja ja, wenn ichs so lese, sieht es tatsächlich so aus :-)

            Hier noch ein Link zu einem Artikel zum Thema MySQL, PHP, Sessions und Zugriffskontrolle, der ein ein guter Einstieg in diese Thematik ist: http://www.sitepoint.com/article/319.

            gruß,
            Severin

            --
            Realität ist das, was nicht verschwindet, wenn man aufhört, daran zu glauben.
            --Philip K. Dick
  3. Hm,

    Käse. Mein Provider hat die 4.1er noch gar nicht drauf (Schlund).

    Was heißt das nun für mich? Das ich erst mal nach altem Muster programmieren muß und später alles umprogrammieren soll?

    Weil weiter unten erwähntest Du, daß man ab 4.1 session_register nicht mehr benutzen soll :-(

    Hm, wenn ja, sollte ich eventuell wirklich alles, was mit den Sessions zu tun hat, in einen Header schreiben, um diesen dann ggf. später einfacher austauschen zu können?

    Grüße

    Rod

    1. Moin!

      Hm,

      Käse. Mein Provider hat die 4.1er noch gar nicht drauf (Schlund).

      Sprich ihn an und frage nach einem Update. Die 4.0-Serie sollte sowieso schon längst eingemottet sein. Und wenn nicht, sollte mindestens die letzte, aktuelle Version von 4.0 verwendet werden, das ist 4.0.6. Alle Versionen vorher haben mit Sicherheit irgendwelche Sicherheitsprobleme, die man ganz schleunigst durch Update umgehen sollte.

      Was heißt das nun für mich? Das ich erst mal nach altem Muster programmieren muß und später alles umprogrammieren soll?

      Das würde es im Prinzip heißen.

      Sorge dafür, dass du eine neue PHP-Version kriegst. Das ist auch im Interesse des Providers, denn Kunden werden sich deshalb sicherlich häufiger beschweren. Kann sein, dass diese Forderung ganz simpel zu erledigen ist, indem dein Webspace einfach auf einen neuen Server geschoben wird.

      Hm, wenn ja, sollte ich eventuell wirklich alles, was mit den Sessions zu tun hat, in einen Header schreiben, um diesen dann ggf. später einfacher austauschen zu können?

      Das wäre nicht schlecht. Aber es ist dennoch ein ziemlicher Aufwand.

      Leider ist PHP 4 erst seit 4.1 einigermaßen erwachsen geworden, die Versionen davor sind alle noch ziemlich auf PHP 3 ausgerichtet. Das macht sich an vielen Stellen deutlich, an denen PHP aus heutiger Sicht ganz schön dumme Sachen gemacht hat.

      - Sven Rautenberg

      --
      "Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
      (fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)
      1. Hi Sven,

        sorry, ich hab auf Dein Posting hin nochmal bei Schlund angerufen und erfahren, daß der MA von vorhin Müll erzählt hat.
        Schlund fährt die 4.2.3er Version. *aufatme*

        Also doch weiter im Text... :-)

        Ich versuche jetzt erstmal, die ganzen neuen Sachen umzusetzen, die ich hier erfahren habe.
        Ich melde mich dann uaf jeden Fall wieder, dann in einem neuen Thread mit ähnlichem Betreff. Hoffe, ich darf dann nochmal auf Deine und die Hilfe der anderen zählen.

        Viele Dank an alle

        Grüße

        Rod

        1. Hallo,

          sorry, ich hab auf Dein Posting hin nochmal bei Schlund angerufen und erfahren, daß der MA von vorhin Müll erzählt hat.
          Schlund fährt die 4.2.3er Version. *aufatme*

          Kleiner Tip:
          Mach mal eine Datei, z.B. phpinfo.php
          Dort schreibst Du als einziges rein:
          <?php phpinfo() ?>
          Dann rufst Du diese Datei mit dem Browser auf.
          Dort erfaehrst Du sehr viel ueber die aktuell
          verwendete PHP-Version, ueber Konfigurations-Variablen, ...

          Gruesse,

          Thomas

          http://www.php.net/manual/de/function.phpinfo.php

          1. Kleiner Tip:
            Mach mal eine Datei, z.B. phpinfo.php

            Hi,

            danke. Klar, die hab ich sogar schon auf meinem Server liegen, habs nur vergessen :-))

            Also: Version 4.2.3 stimmt :-)

            Roddy