Frank Fischer: Verständnisfrage zu Login und Sessions

Hallo,

ich habe einen Bereich in meiner Seite, den der Nutzer nur sehen darf, wenn er sich einloggt.

Ich habe also ein Login gebaut und nach erfolgreichem Login bekommt der Nutzer eine Session-Id. Jetzt darf er sich also die gesperrten Inhalte anschauen.

Nun aber mein Problem.
Wie kann ich beim Aufruf jeder Seite, die im gesperrten Bereich liegt überprüfen, ob derjenige, der die Seite aufruft überhaupt eingeloggt ist ? Wie kann ich die Gültigkeit der Session-Id auf den gesperrten Seiten überprüfen ? Mir fehlt da irgendwie das Verständnis zu Sessions, obwohl ich schon sämtliche FAQs ... durchgelesen habe. :-(

Danke
ff

  1. HAlloa,

    gibt dem User einfach den Variable mit auf den Weg:

    $_SESSION[eingeloggt]=true;

    Auf die Var kannst Du dann immer zurückgreifen:

    if ($_SESSION[eingeloggt]!=true)header("LOCATION: http://www.domain.de/login.php");

    An die Anderen:
    Warum soll man $_SESSION verwenden und nich session_register("session")???

    Greets Tom1tk

    1. Hello,

      gibt dem User einfach den Variable mit auf den Weg:

      $_SESSION[eingeloggt]=true;

      Und wenn Du ihm

      $_SESSION[logcheck] = time();

      bibst, dann könntest Du auch vor dem Aktualisieren dieser Variable fragen, wie lange der User schon nicht mehr geklickt hat. Wen  es dann zu lange her war, dann kannst Du ihn automatisch ausloggen.

      Außerdem stehen die Userrechte bestimmt in einer Datenbank. Man wird nicht drum herum kommen, bei jedem Request dort nachzuscheun, wie die Rechte stehen. Wenn sie sich in den letzten dreizehn Tagen, seitdem sich der User angemeldet hat und ständig für traffic gesorgt hat, nämlich geändert haben, sollten sie ja schließlich auch effektiv werden. Und wenn es erst 0,5sec her ist, auch.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. Hallo,

        $_SESSION[eingeloggt]=true;

        ^^        ^^

        $_SESSION[logcheck] = time();

        ^^      ^^
        Also bitte, Tom, _das_ haette ich nicht von Dir erwartet.
        Dass Du es ihm durchgehen laesst, ist eine Sache.
        Dass Du es aber selbst schreibst, kann ich fast nicht glauben! ;-)

        Warum ist $foo[bar] falsch?
        http://www.php.net/manual/de/language.types.array.php#language.types.array.foo-bar
        Wichtige Ausnahme: Innerhalb von doppelten Anfuehrungszeichen:
        http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing.simple
        http://www.php.net/manual/en/language.types.string.php#AEN3609
        Korrekt: echo "Blabla $foo[bar] Blabla";
        Korrekt: echo "Blabla {$foo['bar']} Blabla";
        Falsch: echo "Blabla $foo['bar'] Blabla";

        Gruesse,

        Thomas

        1. Hallo Thomas'e (=Namenskollegen)!

          Warum sollte man denn überhaupt $_SESSION verwenden? Ist diese Var automatisch reserviert bei session_start(), oder muss ich dier erst session_register(_SESSION)??

          Greets Tom1tk

          1. Hello Tom & Thomas,

            Warum sollte man denn überhaupt $_SESSION verwenden? Ist diese Var automatisch reserviert bei session_start(), oder muss ich dier erst session_register(_SESSION)??

            Ja, das sollte man scho  erklären. Es handelt sich um eins der redervierten Arrays. Dieses wird bei session_start() automatisch angelegt. Leider wird auch noch $HTTP_SESSION_VARS angelegt bei PHP 4. Erst ab PHP 5 kann man diese unnütze Doublette abschalten.

            Beim Session-Start werden automatisch die Session-Variablen in die beiden Arrays geladen. Die haben ab dann nichts mehr miteinander zu tun. Deshalb sollte man gleich nach session_start() ein unset($HTTP_SESSION_VARS) absetzen, allerdings aus dem Namensraum, in dem session_start() ausgeführt wurde.

            @Thomas L.

            Das war doch nur Pseudo-Code. Ich hab schon wunde Finger, wenn ich den ganzen Tag soviel Häkchen toppen muss... ;-))

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Hallo nochmals,

              streikt php eigentlich, wenn man globals=on hat, dann
              global $_SESSION;
              setzen will?
              Ich hab grad meine Seite auf $_SESSION umgebaut und von früher noch global $_SESSION dranstehen gehabt. Das gab nen Fehler aus.
              Kann ich dennoch überall auf $_SESSION zugreifen? Auch in Funktionen?

              Thanx Tom1tk

              1. Hello,

                streikt php eigentlich, wenn man globals=on hat, dann
                global $_SESSION;
                setzen will?

                Version?

                Also, $_SESSION sollte bereits superglobal und damit auch global sein.
                Mit $HTTP_SESSION_VARS gabs immer noch Probleme, wenn man die Session in einer Funktion gestartet hatte. Da musste man vorher die Vars im hauptpraogramm als Glonal deklarieren und dan in der Funktion bestätigen.

                Aber mit $_SESSION sind diese Probleme beseitigt.

                Man kann ja auch

                $HTTP_SESSION_VARS = &$_SESSION;

                schreiben. Damit sind die alten Session-Vars platt und sind fortan nur eine Kopie von $_SESSION. Damit müssten sie auch superglobal sein. habe ich aber noch nicht probiert.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                1. Hi Tom,

                  Version: 4.2.3 und globals sind on (kann ich auch nicht ändern) Zur Sicherheit initialisiere ich immer alle (sicherheitsrelevanten) Vars neu:

                  z.B. $logincheck="";
                  $passwort=$_SESSSION["logincheck"];
                  Ist das hier korrekt mit ["Gänsefüßle"]??

                  Ist das sicher? Oder kann man über bla.php?_SESSION[logincheck]=xyz das System knacken?

                  Wie kann ich das unterbinden?

                  Greets nach Braunschweig,
                  Tom1tk

                  1. Hello,

                    Hi Tom,

                    Version: 4.2.3 und globals sind on (kann ich auch nicht ändern) Zur Sicherheit initialisiere ich immer alle (sicherheitsrelevanten) Vars neu:

                    Wieso kannst Du das nicht ändern?
                    Das lässt sich doch für jeden virtual Host separat einstellen.

                    Und dann würde ich mal langsam einen fähigen Praktikanten (m/w) dransetzen, die das in den Scripten repariert. Ist eine wunderbare Verständnisprüfung und leider auch eine Fleißarbeit.

                    Liebe Grüße aus http://www.braunschweig.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    1. Hello,

                      Hi Tom,

                      Version: 4.2.3 und globals sind on (kann ich auch nicht ändern) Zur Sicherheit initialisiere ich immer alle (sicherheitsrelevanten) Vars neu:

                      Wieso kannst Du das nicht ändern?
                      Das lässt sich doch für jeden virtual Host separat einstellen.

                      Lieber Tom
                      Nicht jeder User hat einen eignen Server mit vielleicht sogar Root Zugriff.
                      Und ein Massenhoster wird Dir was husten wenn Du von Ihm verlangst das auf deinem virtuelleh Host umzustellen.

                      Viele Grüße aus Berlin

                      1. Hello,

                        Lieber Tom
                        Nicht jeder User hat einen eignen Server mit vielleicht sogar Root Zugriff.
                        Und ein Massenhoster wird Dir was husten wenn Du von Ihm verlangst das auf deinem virtuelleh Host umzustellen.

                        Dann mach er es sich doch selber mit einer .htaccess-Datei. Und wenn er das nicht darf, wechsele er endlich den Provider *gg*

                        Es gibt wirklich guten Serveice schon für 15Euro im Monat und da kann man dann einstellen und Einrichten, was einem gefällt.

                        Liebe Grüße aus http://www.braunschweig.de

                        Tom

                        --
                        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        2. Guten Abend TomLuethi

          Hallo,

          $_SESSION[eingeloggt]=true;
                         ^^        ^^
            $_SESSION[logcheck] = time();
                        ^^      ^^
          Also bitte, Tom, _das_ haette ich nicht von Dir erwartet.
          Dass Du es ihm durchgehen laesst, ist eine Sache.
          Dass Du es aber selbst schreibst, kann ich fast nicht glauben! ;-)

          Ähm, entweder habe ich was flasch verstanden oder ?
          Hier kopie von php.net:

          Zeile1: echo "Schlecht: " . $array['$i'] . "\n";
          Zeile2: echo "Gut: " . $array[$i] . "\n";
          Zeile3: echo "Schlecht: {$array['$i']}\n";
          Zeile4: echo "Gut: {$array[$i]}\n";

          Wie schreibt man dann ein Wertzuweisung?
          $array[$i]=time();
          oder
          $array['$i']=time();

          So wie ich das verstehe ist Zeile 1 schlecht, oder?? Also ist die Lösung vom TomBraunschweig schon OK. Oder?

          Danke für Aufklärung über das Mysterium "Array"!

          Greets Tom1tk

          1. Hallo Tom,

            Hier kopie von php.net:

            Deine untenstehenden Beispiele haben _Variablennamen_ als Schluessel.
            Was ich angemeckert hatte, waren konkrete _Strings_ als Schluessel.
            Und _die_ muessen in Anfuehrungszeichen stehen, weil sie sonst
            (als Fallback, schlecht, aber funktionierend) als Konstanten betrachtet werden.

            Das steht alles auch auf der von Dir zitierten Seite. Bitte genau lesen!
            http://www.php.net/manual/de/language.types.array.php#language.types.array.foo-bar

            Vorbemerkung: Im Beispiel hat die Variable $i den Inhalt 0 oder 1, also eine Zahl.
            Es koennte geradesogut ein String sein.
            (PHP unterscheidet bei Schluesseln nicht zwischen Zahlen und Strings; man kann
            auch bunt mischen, wenn man will. Uebersichtlich ist das aber nicht...)

            Zeile1: echo "Schlecht: " . $array['$i'] . "\n";

            Ja, schlecht, weil hier der _Variablenname_ in _einfachen_
            Anfuehrungszeichen steht und somit nicht interpretiert wird.
            Der Schluessel waere hier der String $i (Dollar, i),
            und fuer diesen Schluessel enthaelt der Array keinen Inhalt,
            was auch zur angegebenen Fehlermeldung fuehrt:
            "Undefined index:  $i"

            Zeile2: echo "Gut: " . $array[$i] . "\n";

            Ja, die Anfuehrungszeichen sind nicht notwendig,
            denn Du setzt den Variablennamen ein, und somit ist
            der Schluessel dann den Inhalt der Variable, hier die Zahl 1.

            Zeile3: echo "Schlecht: {$array['$i']}\n";

            Ja, siehe oben.
            Zwischen den geschweiften Klammern gilt das gleiche
            wie _ausserhalb_ der doppelten Anfuehrungszeichen...

            Zeile4: echo "Gut: {$array[$i]}\n";

            Ja, siehe oben.

            $array[$i]=time();
            $array['$i']=time();

            So wie ich das verstehe ist Zeile 1 schlecht, oder??

            Nein, gerade nicht. Zeile 1 ist gut, Zeile 2 ist schlecht.

            Zur Wiederholung und Klarstellung:

            Zahl als Schluessel:
            $meinarray[1] ist gut.
            $meinarray['1'] ist gut.
            $meinarray["1"] ist gut.

            String als Schluessel:
            $meinarray[bla] ist schlecht.
            $meinarray['bla'] ist gut.
            $meinarray["bla"] ist gut.

            Variablenname als Schluessel:
            Voraussetzung: Die Variable $variablenname enthaelt eine Ganzzahl (Integer) oder einen String
            $meinarray[$variablenname] ist gut
            $meinarray['$variablenname'] ist schlecht
               (ausser man meint den String $i als Schluessel, aber nicht zu empfehlen...)
            $meinarray["$variablenname"] funktioniert und ist IMHO OK
               (weil die Variable zwischen den doppelten Anfuehrungszeichen interpretiert wird)

            Siehe auch: Variablen-Analyse (parsing) in Strings:
            http://www.php.net/manual/en/language.types.string.php#language.types.string.parsing

            Gruesse,

            Thomas

            --
            Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
            Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
            Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
            1. Hallo,

              Sorry, winzige Korrektur:

              $meinarray['$variablenname'] ist schlecht
                 (ausser man meint den String $i als Schluessel, aber nicht zu empfehlen...)

              sollte natuerlich heissen:
              ... (ausser man meint den String $variablenname als Schluessel

              mfg, Thomas

              1. Vielen Dank.

                Das war mal ne richtige Erklärung (auch so, dass ich es verstanden habe!)

                Vielen Dank
                Tom1tk

      2. Hello,

        Hello,

        gibt dem User einfach den Variable mit auf den Weg:

        $_SESSION[eingeloggt]=true;

        Und wenn Du ihm

        $_SESSION[logcheck] = time();

        Also, das muss:

        $_SESSION['logcheck'] = time();  oder ggf. auch noch
           $_SESSION["logcheck"] = time();  heißem.

        Die zweite Variante ist wharscheinlich langsamer, da der Parder erst noch auf Variablenauflösung schielen muss. Gerade, wenn man Arrays rekursiv oder in Schleifen füllt, dann könnte das schon ein paar Microsecunden kostren *gg*

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen