Sessions verwalten -> Doppellogins verhindern

Chriss3000

Grünschnabel
Hallo.

Derzeit versuche ich mich etwas in Html und PHP um meine Kentnisse dahin gehend etwas zu erweitern.
Ich bin im Moment mit dem Erstellen eines Logginscriptes beschäfftigt und würde dabei gerne die PHP eigenen Session Funktionen nutzen.

Mein Problem liegt derzeit darin, das ich einen Weg erarbeiten will, wie ich verhindern kann das der gleiche Nutzer durch einloggen in zwei Verschiedenen Browserfenstern auch gleichzeitig zwei verschiedene sessions startet.

Zum einen ist das sicher dadurch zu verhindern, dass man die SessionID ausschließlich in Cookies speichert. Dann jedoch werden ja alle User die Cookies deaktiviert haben von der Nutzung ausgeschlossen.

Zweiter Weg den ich mir überlegt habe, ist die SesssionID zusätzlich in die Userdaten DB zu speichern und beim erneuten Loggin des Users dann die in der DB eingetragene SSID zu übergeben. Problem dabei wäre der Fall, dass ein User sich nicht regulär ausloggt sondern einfach den Browser schließt. PHP würde dann (wenns richtig gemacht ist) die Session nach einer bestimmten Zeit ja einfach löschen. Die DB wäre aber noch nicht aktualisiert. Und wenn die dann für PHP wieder freie SessionID an einen anderen User vergeben wurde und der erste User loggt sich wieder ein......-> ungünstig.

Daher müsste ich in die Sessions auch immer noch ein zweites Identifikationsmerkmal wie z.B. den Usernamen speichern und beim Loggin vom ersten User dann erst prüfen, ob die in der DB stehende SSID mittlerweile zu einem anderen User gehört. Bzw. ich würde prüfen, ob noch eine Session des erten Users läuft.

Meine Frage ist nun wie man dies am elegantesten erledigen kann.?

Hatte mir das Laienhaft mal so vorgestellt:

Code:
1) Session_start()
2) Session_ID("SSID aus DB") 
3) Session_start() // um neue SSID wirksam werden zu lassen
4) If ($_SESSION['Nick'] == $Nick_Login) -> Dann wird diese SessionID weiter verwendet.
5) else -> Session_destroy() ->Session_start() // Neue Session wird gestartet

Halltet ihr das für eine elegante Lösung? Weiß grad garnicht, ob das überhaupt funktionieren würde, oder ob mit dem Befehl "Session_ID" dann die alte Session mit der SSID überschrieben wird!?

Danke schonmal für eure Hilfe.

Gruß

Chris
 
Zuletzt bearbeitet:
Naja auf jeden Fall musst du etwas auf dem Server hinterlegen. Du hast ja den Nick des Benutzers der sich einloggen will. Also könntest du Nick und SessionID in die Datenbank speichern (mit der aktuellen Uhrzeit).

Wenn sich dann jemand mit dem selben Nick anmelden will guckst du einfach ob schon jemand mit dem Benutzernamen angemeldet ist (mit einer Zeit aus den letzten x Minuten). Falls das der Fall ist kann sich derjenige halt nicht nochmal anmelden.

Du müsstest aber bei jedem Klick des angemeldeten Benutzers die Zeit in der Datenbank aktualisieren damit du auch Timeouts abgreifst. Das Problem ist (wie du schon sagst) das man einfach das Browserfenster schließen könnte und sich dann neu anmelden will. Die Session vom Benutzer ist weg und in der Datenbank steht noch eine relativ aktuelle Zeit = keine Anmeldung möglich bis Zeit x überschritten ist. Das selbe würde aber auch passieren wenn man x Minuten keine Eingabe macht.

Was ich mich aber generell frage:
Warum willst du das verhindern? Also ich arbeite gerne in mehreren Fenstern. Außerdem könntest du mit der Methode eigentlich nicht das nutzen von mehreren Tabs nutzen. Und ich weiß auch nicht was passiert wenn man Rechtsklick -> in neuem Fenster öffnen macht. Dann hätte man ja den selben Effekt.

Schwieriges Thema - aber wie gesagt:
Warum willst du das verhindern?

lg
 
Ich hatte auch bereits drüber nachgedacht so eine simple Lösung zu wählen und zu sagen man kann sich erst 5min nach der letzten Aktivität wieder einloggen. Um so dann eben ein Doppellogin zu verhindern. Aber wenn der User sich dann nicht korrekt ausloggt muss er eben die 5 Min warten bis er sich wieder einloggen kann.

Ich bin mir noch nicht ganz im klaren darüber, was die Session Variablen im weiteren Seitenverlauf für eine Rolle spielen werden. wollte es evtl nutzen um weniger DB Abfragen machen zu müssen. In diesem Fall wäre es dann ungünstig, wenn ein User zwei Sessions unterhält, da er dann ja nicht auf die gleichen Session Variablen zugreift. Ergo müsste ich doch ständig die DB aktualisieren um eine gemeinsame Datengrundlage in beiden Fenstern zu schaffen.

Wenn jemand sagt, er kopiert die URL in ein anderes Fenster und arbeitet dann von dort weiter greift er aber doch dennoch immer auf die gleiche Session und damit auf die gleichen variableninhalte zu. Da er ja die SSID unverändert mit kopiert hat.

@Jooohny: Ich hatte auch schon drüber nachgedacht die Sessions selbst zu verwalten und dann in mysql Tabellen abzulegen. Aber ich dachte mir, wenn php schon so eine Möglichkeit bietet!? Warum diese dann nicht nutzen!? Könnte mir vorstellen, das dies dann etwas performanter ist als meine holpernden Coding versuche. ;-)
 
Zuletzt bearbeitet:
Was willst du denn da rein speichern? Wenn du allgemeine Benutzerdaten speichern willst ist das kein Problem wenn es mehrere Fenster gibt.

Und wenn du die Datenbank um eine Abfrage entlastet freut die sich bestimmt das sie mal 0,0001 Sekunden Pause hat, aber du musst die Abfrage mit deiner Lösung doch eh machen da du die eingeloggten Benutzer auch verwalten müsstest (und das wesentlich aufwendiger).

Ich würde sagen:
Speicher einfach nichts Ablaufspezifisches in die Session und du bekommst keine Probleme...

lg
 
Ja du hast schon recht. Alles was Ablaufspezifisch ist und in Sessions steht, ginge im Fall das der Rechner des Users abstürzt oder das er das Fenster einfach zuknallt ja auch verloren.
Komm wohl nicht drum rum schonmal etwas langläufiger zu konzipieren. ;-P

Aber prinzipiell wäre die von mir vorgeschlagenen Lösung schon umsetzbar?

Gruß

Chris
 
Kann ich nicht ohne Bauchschmerzen mit einem klaren "JA" beantworten.
Ich würde sagen solche spielereien (von meiner Seite aus) auf eigene Verantwortung. Ich finde es wie gesagt sinnfrei. Obwohl es ja mehrere Webanwendungen gibt in die die SessionID (aus dem Grund?) in der URL mitgegeben wird. Das macht das ganze Script natürlich von außen auch leicht anfällig.
http://www.google.de/search?hl=de&q=session+highjack&meta=

Würde mir hier einiges aber noch genau durchlesen:
http://de.php.net/manual/de/function.session-id.php

Also aufpassen :)

lg
 
Ja gut ich werd mal schaun. Ich denke ich werde dann vielleicht doch Doppellogins zulassen. Hab mich da wohl wieder in etwas verrannt. ;-)

Danke.

Gruß

Chris
 
Zurück