Marco: Alle offenen Session anschauen

Hallo zusammen

ich habe eine kleine Frage und zwar bin ich an einer Plattform
auf welcher man sich anmelden muss mit Benutzername und Passwort.

Bei einer erfolgreichen Anmeldung wird dem Benutzer seine ID usw.
zugeordnet mit

$_SESSION[id] = 5

Schön und gut das funktioniert auch alles einwandfrei. Was ich nun
möchte ist, schauen wer sich alles angemeldet hat d.h. ich möchte von allen offenen Session die "id" erhalten.

Kann ich das irgendwie machen? Denn so könnte ich schauen, wer alles angemeldet ist.

Freue mich riesig auf Eure Hilfe.

Marco

  1. Hallo
    Sessions auslesen geht nicht. Du kannst höchstens die Daten der Session, in der du dich gerade befindest, auslesen, aber nicht von allen Sessions, die gerade aktiv sind.
    Das Prinzip, jeder Besucher bekommt eine SID, verhindert das.
    MfG
    Mufti

    1. Hallo Mufti

      Schade! War der Meinung, die werden irgendwo in ein temp-Verzeichnis gespeichert und das kann man irgendwie auslesen.

      Dann war das wohl nix.

      Gruss Marco

      1. Hi

        Schade! War der Meinung, die werden irgendwo in ein temp-Verzeichnis gespeichert und das kann man irgendwie auslesen.

        Werden sie auch, aber woran siehst du, welche Session gerade aktiv ist? Die Sessions bleiben dort gespeichert, egal ob aktiv oder nicht, bis du sie löscht (ich weiß allerdings nicht genau, ob der Server das auch automatisch macht/machen kann).

        MfG
        Mufti

        1. Hi

          Schade! War der Meinung, die werden irgendwo in ein temp-Verzeichnis gespeichert und das kann man irgendwie auslesen.

          Werden sie auch, aber woran siehst du, welche Session gerade aktiv ist? Die Sessions bleiben dort gespeichert, egal ob aktiv oder nicht, bis du sie löscht (ich weiß allerdings nicht genau, ob der Server das auch automatisch macht/machen kann).

          MfG
          Mufti

          Jo, macht er. Nach einer Dauer von session.cache_expire Inaktivität wird die Datei gecancelt.

          MfG

          Bruno

          1. Hallo Bruno & Mufti

            Ja genau und aus diesem Grund denke ich, dass man einfach alle Session dort nehmen kann. Klar kann ein User einfach den Browser schliessen und die Session bleibt offen. Dann ist er halt noch z.B. 5 Minuten Online dann wird seine Session ja eh gelöscht.

            Weil wenn ich alle Session in eine DB schreibe, dann würde das gehen aber nur, wenn sich alle User schön wieder abmelden. Was eben, wenn einer einfach das Browserfenster schliesst? Dann bleibt er immer eingetragen in der DB!?

            Marco

            1. Hallo Bruno & Mufti

              Ja genau und aus diesem Grund denke ich, dass man einfach alle Session dort nehmen kann. Klar kann ein User einfach den Browser schliessen und die Session bleibt offen. Dann ist er halt noch z.B. 5 Minuten Online dann wird seine Session ja eh gelöscht.

              Weil wenn ich alle Session in eine DB schreibe, dann würde das gehen aber nur, wenn sich alle User schön wieder abmelden. Was eben, wenn einer einfach das Browserfenster schliesst? Dann bleibt er immer eingetragen in der DB!?

              Marco

              Du müßtest bei jeder Aktion eines Users (Login, Seitenaufruf, Logout) alle Benutzer aktualisieren (in DB schauen, wessen Time Expire abgelaufen ist).

              Nötig ist es aber nicht. PHP löscht die Session automatisch.

              Mfg
              Bruno

              1. Hallo Bruno

                verstehe ich nicht ganz. Kannst Du mir das evt. genauer erklären wäre mega lieb!

                Verstehe auch nicht ganz diesen Satz:

                "Nötig ist es aber nicht. PHP löscht die Session automatisch."

                Weil ich muss ja immer schauen ob er noch da ist, PHP löscht mir diese ja nicht automatisch beim beenden der Session herraus *grübel*

                marco

                1. Hallo Bruno

                  verstehe ich nicht ganz. Kannst Du mir das evt. genauer erklären wäre mega lieb!

                  Verstehe auch nicht ganz diesen Satz:

                  "Nötig ist es aber nicht. PHP löscht die Session automatisch."

                  Weil ich muss ja immer schauen ob er noch da ist, PHP löscht mir diese ja nicht automatisch beim beenden der Session herraus *grübel*

                  marco

                  Ich nehme an, Du hast eine inkludierte Datei, die Login, Logout und auf abgelaufene Sessions prüft. Die Überprüfung auf abgelaufene Sessions müßtest Du dann halt auf alle Sessions erweitern. Die SID stehen Dir ja zur Verfügung, wenn Du sie vorher irgendwo gespeichert hast.

                  Wenn eine PHP-Session eine bestimmte Zeitspanne keine Aktualisierung erfährt, entfernt PHP die Datei aus dem temporären Verzeichnis. Die Zeitspanne, nach der das passiert, wird über session.cache_expire geregelt. Deshalb brauchst Du dich eigentlich gar nicht darum zu kümmern. Der oben stehende Weg ist nur dann notwendig, wenn Du ein eigenes Session-Management baust, das nicht auf die PHP-Session-Funktionen zurückgreift.

                  Ich hoffe, das ist jetzt verständlicher. Wenn nicht, frag halt noch mal.

                  1. Hallo Bruno

                    Zuerst mal danke für Deine Bemühungen. Also ich habe includierte Dateien für Login, Logout aber nicht für abgelaufene Session.

                    Also Schritt eins ist mir mal klar, ich speichere die Session nummer in die DB zum Beispiel einfach in der Tabelle Benutzer unter ID.

                    Schön und gut. Nun ist diese Nummer dort drin. Wie genau muss ich denn jetzt vorgehen? Das ist jetzt der Punkt wo ich nicht ganz verstehe, denn wenn der User das Browserfenster schliesst, dann ist die Sessionnummer ja einfach in der DB! Klar wenn er logout macht, dann kann ich diese löschen aber was wenn er das nicht macht?

                    das verstehe ich nicht...

                    Hmm, evt meinst du das so, dass ich zu der session auch noch jedesmal die zeit hinschreibe, wann diese zuletzt aktuallisiert wurde. dann z.b. mittels cronjob alle 5 minute schaue, ob diese session älter als 5 minute ist wenn ja wird sie gelöscht?

                    *grübel* :-)

                    Freue mich auf Dein Feedback!

                    Marco

                    1. Hmm, evt meinst du das so, dass ich zu der session auch noch jedesmal die zeit hinschreibe, wann diese zuletzt aktuallisiert wurde.

                      Das oder wann die Session abläuft, egal wie rum.

                      dann z.b. mittels cronjob alle 5 minute schaue, ob diese session älter als 5 minute ist wenn ja wird sie gelöscht?

                      Nicht so kompliziert. Wenn das nächste Mal die inkludierte Datei aufgerufen wird von irgend einem User, liest Du alle Datensätze aus, die z. B. die Spalten SID, letzte_aktion haben. Jetzt schaust Du bei allen, ob der in letzte_aktion gespeicherte Wert + Zeit X kleiner der aktuellen Zeit ist. Wenn ja, löscht die Session (Du löschst alle Datensätze, auf die das zutriffst). Wenn Du das mit PHP-Sessions kombinierst (was, wie schon mehrfach gesagt, dann eigentlich nicht nötig ist), fragst Du bei jedem Zugriff eines Benutzers ab, ob seine SID noch in der DB steht. Nein? Dann ist seine Session abgelaufen, und er weitergeleitet zum Login.

                      Wenn Du mit PHP-Sessions arbeitest, brauchst Du aber gar nichts in einer DB speichern (es sei denn Sonderwünsche wie mehrfach falsche Angaben beim Login sperren den Account für 24 Stunden oder so ähnliches). Du speicherst in einer Session-Variable den Zeitpunkt des letzten Zugriffs. Bei jeder Aktion des Users, wird Dein Skript durchlaufen. Darin prüfst Du, ob die Session abgelaufen ist. Wenn nicht, speicherst Du in ihr die aktuelle Zeit.

                      Wenn er sich ohne Logout verabschiedet, bleibt zwar die Session offen. Durch die Sessionvariable mit dem letzten Zugriff, die nicht mehr aktualisiert wird, ist aber eine Sicherung eingebaut, daß sich Unbefugte keinen Zutritt verschaffen. Sollten sie, was absolut unwahrscheinlich ist, an die Session-ID kommen, haben Sie nur eine beschränkte Zeit, was mit ihr anzufangen. Ist die Zeit abgelaufen, nutzt ihnen die SID nichts mehr.

                      Die Session-Datei bleibt bestehen, da hast Du recht. Wenn sich in ihr nichts ändert, merkt das aber PHP und löscht sie automatisch. Die Zeitspanne, nach der das passiert, kann in php.ini eingestellt werden. Ist aber auch egal, weil keiner mehr mit ihr was anfangen kann, sobald die Sitzung (gemäß Deinem Skript) abgelaufen ist. Ob PHP meint, die Sitzung gibt es noch oder nicht, ist egal, weil Du ja intern über die Sessionvariable prüfst, ob die Zeit abgelaufen ist. Du brauchst Dir deshalb um diesen Punkt wirklich keinen Gedanken machen - wenn Du mit einem automatischen Session-Logout arbeitest, was ich Dir raten würde. Wenn Du intern nicht die Zeiten vergleichst, dann bleibt die Session halt etwas länger gültig, aber niemals über den in php.ini festgelegten Wert hinaus.

                      *grübel* :-)

                      Freue mich auf Dein Feedback!

                      Marco

          2. hi,

            (ich weiß allerdings nicht genau, ob der Server das auch automatisch macht/machen kann).

            Jo, macht er. Nach einer Dauer von session.cache_expire Inaktivität wird die Datei gecancelt.

            Das ist falsch.

            session.cache_expire bestimmt, welche Angabe dem Client gemacht werden soll, wie lange er eine Ressource, die Sessions verwendet, cachen darf.

            _Ab wann_ eine Session-Datei bei Inaktivität entfernt werden _darf_, bestimmen hingegen die Einstellungen session.gc_maxlifetime (die, entgegen ihrem Namen, eine minlifetime darstellt), session.gc_probability und session.gc_divisor.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. Hallo Mufti

        Schade! War der Meinung, die werden irgendwo in ein temp-Verzeichnis gespeichert und das kann man irgendwie auslesen.

        Dann war das wohl nix.

        Gruss Marco

        Wo die Dateien gespeichert werden, steht in session.save_path. Du könntest bei jeder Neuvergabe einer SID diese in ein Flatfile oder eine DB schreiben.

  2. Hello Marco,

    ich ahbe mit den Thread bis "Bruno... 01.06.2007, 21:59" mal durchgelesen und muss feststellen, dass außer wahsaga niemand anseitsweise sinnvolle Hinweise gegeben hat.

    Eine Session ist ein Mechanismus zur leichten Wieder-Identifikatione eines Benutzers. Um den Benutzer zu authentifizieren bedarf es schon mal einer eigenen auf der Session aufgesetzten oder ihr vorausgehenden Aktion. Das Ergebnis kann in der Session gespeichert werden, damit von nun an der Client wiedererkannt wird. Die Sicherheit beruht dabei ausschließlich auf einem genügende komplizierten (eindimensionalen) Schlüssel und der Zeit, in der er gültig ist. Je länger die Gültigkeitsdauer, desto geringer wird die "Sicherheit".

    Um nun festzustellen, wer "angemeldet" ist, müsste man also wissen, wer einen gültigen Schlüssel bezogen hat, und ihn zu benutzen gedenkt, ihn also auch noch nicht weggeworfen hat. Da Du vom Server aus bei verbindungslosen Architekturen keine gezielte Verbindung mit dem Client aufnehmen kannst, kannst Du also nicht feststellen, ob der Client den Schlüssel noch kennt. Du kannst nur feststellen, ob er am Server noch gültig ist.

    Allerdings hat ein "Login" eigentlich auch nichts direkt mit der Session zu tun. Eine Session wird benutzt, um das "Login" zu registrieren, aber sie ist kein Garant für ein "Login".

    Das "Loginsystem" sollte von Dir selbst auf die Session aufgesetzt werden. Bei jedem Zugriff des Users schaust Du in der passenden Datenbantabelle, ob für diesen Client (in diesem Fall über die Session identifiziert) eine Berechtigung vorliegt. In der Tabelle steht dann, der User hat die Rechte $rights, hat sich am $anmeldezeitpunkt angemeldet, hat seine Session das letze Mal um $lastuse benutzt und ist von Dir seit dem nicht $gesperrt worden.

    Nun brauchst Du nur noch die Tabelle abzufragen.
    Die Offenzeit für die Nutzung kannst Du selber bestimmen, vorausgestzt, die Session hält lange genug. Die Offenzeit der Session sollte also immer ausreichend lange sein gegenüber der von dir erlaubten Nutzungsdauer ohne Request (Offenzeit). Die Session ist nur das Trägersystem und sollte nicht zur Feststellung, ob angemeldet oder nicht missbraucht werden.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau