Philipp Hasenfratz: webapplication Konzeptfrage Sessionverwaltung

Beitrag lesen

Halihallo Mark

Hmm, eigentlich soll eben immer nur ein User zur Zeit aktiv sein können. Ähhh, ja, hmm, wie sag ich das denn nun? Also sobald in meiner User-Tabelle ein Benutzer vorhanden ist, sprich eingeloggt ist, soll sich kein weiterer einloggen können und auch nicht das Login des ersten Benutzers verwenden dürfen (eben z.B. durch Kopieren der SessionID)

Das ist mir klar. Nur geht das technisch über HTTP nicht (zu 100%).
Wie gesagt, über ein clientseitiges Programm liesse sich dies relativ
einfach umsetzen.

Wechselnde SessionID - man, da hätte ich auch selbst drauf kommen können... Schäm... Gibt es sonst noch andere Nachteile dieses Verfahrens? Mir fallen sonst eigentlich keine weiteren Nachteile auf...Aber das heißt nichts.. ;-)

Naja, es gibt einige technische Problemchen...
Z.B. speicherst du ja wohl Daten mit der Session (wie z.B. UserId).
Diese Daten werden normalerweise in einer anderen Tabelle
gespeichert, die über die SessionId (RequestId) mit der Session
verknüpft werden. Falls sich also die RequestId ständig ändert,
müssen alle Daten in der RequestData Tabelle auch geändert werden.
Abhilfe schafft hier folgender Trick: Man generiert eine staatische
SessionId, die in der Session gleich bleibt. Daten der Session werden
über diese SessionId in der DB gespeichert. Die RequestId gehört nun
einfach zu den Daten der Session und nur diese wird geändert. Bei
jedem Request wird also die RequestId (ein Bestandteil der
Sessiondaten) geändert und in alle Formulare/Links angehängt. Beim
nächsten Zugriff wird der Wert aus dem Formular mit der RequestId in
den Sessiondaten verglichen. Bei Nichtübereinstimmung wird die
Session deaktiviert.
Zweitens: Du musst das Caching vollkommen deaktivieren, da sonst
alte Seiten im Cache weiterverwendet werden und deshalb bereits
deaktivierte RequestId's enthalten.
Drittens: Es entsteht natürlich etwas Aufwand die RequestIds jedesmal
zu generieren, dann in die DB zu schreiben und wieder auszulesen. Das
dürfte aber nicht merkbar sein (der Overhead gegenüber staatischer
SessionId ist IMHO sehr, sehr gering).

Naja, bei guter Programmierung sehe ich nicht wirklich bedenkliche
Nachteile. Aber ist ist natürlich sehr viel einfacher eine staatische
SessionId zu verwenden, die sich während der Sessionzeit nicht
ändert.

Aaaaber: Dies ist keine Lösung für dein Problem, denn wenn jemand die
Request- und SessionId aus dem Formular rauskopiert und an einem
anderen Computer diese einfügt, dann kannst du dies nicht bemerken.
Sprich: Du kannst nicht sicherstellen, dass ein User nur von einem
Computer aus arbeitet. Dazu bräuchtest du - wie du sagst - ein
eindeutiges Merkmal des Computers wie z.B. die MAC Adresse seiner
Netzwerkkarte.

Eine Mothode zur 100% erkennung würde mir noch einfallen: Wenn es per Javascript möglich wäre, die MAC-Adresse einer evtl. vorhandenen Netzwerkkarte auszulesen, würden wir der Sache mit der 100%-igen Identifizierung eines Clients näher kommen.. Ich ich glaube nicht, das ich so einfach die MAC-Adresse auslesen kann, sonst wäre das wohl schon längst gang und gäbe - von den Usern ohne Netzwerkkarte mal ganz abgesehen...

Tja. Das wäre schon besser, nur, dass es nicht möglich ist die MAC
Adresse über js oder gar serverseitige Programme auszulesen. Es gibt
zwar einen Exploit für [...] dort die MAC Adresse auslesen kann.
Aber das ist sicher keine Lösung und grenzt an Kriminalität (deshalb
ist es Zensiert :-))...

Viele Grüsse

Philipp