Hello,
Was mache ich falsch?
Du untersacheidest nicht zwischen den physischen Grundlagen für eine Session und deren logischer Umsetzung, die zudem auch noch mehrschichtig sein kann.
Das in PHP implementierte Session-System stellt eine rudimentäre Möglichkeit dar, überhaupt Sessions zu implementieren. Es stellt einen Mecahanismus zur Verfügung, der eine Wiedererkennung des Users ermöglicht. Dieser Mechanismus wird sicherheitshalber nach der session_max_lifetime
<z.tz. leider nicht möglich>
beendet, damit keine Sciherheitslücken entstehen und der Server nicht mit unnützen Dateien vollgemüllt wird.
Wird eine Ressource aufgerufen (Request), so wird bei Verwendung des Sessionmechanismus auch die Gültigkeitsdauer nachgetriggert. Sie beginnt also wieder von vorne.
Grundsätzlich sit der Sessionmechanismus unsicher, da die Berechtigungsdaten (i.d.R. Cookie) über denselben Kanal übertragen werden, wie der Datenrequest und außerdem nur ein einzelner Cookie benutzt wird, und kein mehrteiliger Key. Aus einem einzelnen Cookie kann man keine Angriffe auf einen speziellen Account ableiten. Man kann nur feststellen, dass die Anfrage nicht gültig ist.
Erster Schritt wäre also die Teilung des Cookies in zwei teile. Ein teil gibt Auskunft über den Account, der andere darüber, ob Zugriff erlaubt ist. Dann lässt sich ein wiederholter unerlaubter Zugriff auf eine Account erkennen und man kann Sicherungsmaßnhamen ergreifen.
Zweiter Schritt ist die Erneurerung dieser Teilschlüssel möglichst mit jedem Request. Dafür ist eine zusätzliche Übersetzungsschicht notwendig.
Noch besser wäre dann aber die Verwendung eines verschlüsselten Protokolls.
Nun aber zurück zum Sessionmechanismus bezüglich "Anmelden, Online-Status, Abmelden".
Es ist absolut nicht notwenig, einen Benuter, der längere Zeit nicht zugegriffen hat auf seine Daten "abzumelden". Es würde reichen, anderen Usern erst einmal anzuzeigen, dass dieser User 1, 2, 5, 10 Minuten nicht mehr aktiv war.
Dazu müsste man aber den physikalischen Sessionmechanismus vom logischen trennen.
Wenn die Basis mittels PHP session_start() und der verwandten Freunde hergestellt wurde, kannst Du z.B. mittels Eintrag der Zugriffsdaten in eine Datenbank ermitteln, ob der User "angemeldet", "wie aktiv", oder "abgemeldet" ist.
Dazu gibt es hier im Archiv auch schon diverse Threads, die ich bei Interesse gerne heraussuche.
Wichtig ist nur, dass die Basisschicht die Session nicht eher abbrechen darf, als es die logische Schicht tut.
Die Basisschicht ist "Authorisation per Login"
Die Logische Schicht kann hingengen auch "Authorisation per Request"
oder sogar "Authorisation per Function" (on the fly) sicherstellen.
Gerade bei Ausdehnung von Anmeldungs-Gültigkeitsdauern sollte man überlegen, ob man das überhaupt verantworten kann.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg