Da ich ja zur Zeit daheim keine Internetverbindung habe hab ich mich mal wieder mit meiner Website und den dafuer eingesetzten Techniken befasst.
Meine Sessions laufen ja bereits von Anfang an sowohl mit als auch ohne Cookies, bei der ersten Verbindung wird geprueft ob Cookies angenommen werden (siehe
Ueberpruefung von Cookies und JavaScript mit PHP) und dies in der Datenbank festgehalten.
Nun ist es ja so, dass so eine SessionID (ob nun per URL oder Cookie uebergeben spielt dabei keine Rolle) gestohlen werden kann. Um das zumindest ein wenig einzudaemmen (ganz verhindern kann man es eh nicht) hab ich mir eine eigene Session-Verwaltung in Form einer Klasse geschrieben. Dabei gehoeren zur Identifikation einer Session eben nicht nur die SessionID, sondern eben auch die IP und der User-Agent. Es ist mit der Klasse theoretisch also auch moeglich, dass eine SessionID doppelt vergeben wird, eben an verschiedene Clients. Natuerlich ist das kein hundertprozentiger Schutz, aber wohl wesentlich besser als nur mit der SessionID zu arbeiten.
Da mir auch nie gefallen hat, dass die Session-Dateien immer so lang auf dem Server liegen bleiben hatte ich bereits eine eigene Garbage-Collection welche alten Session-Dateien wieder loescht.
Da dies unter Umstaenden zu Problemen mit dem SafeMode fuehren koennte nutzt meine Klasse keine Session-Dateien sondern speichert die Session in der Datenbank, dank meiner Klasse MultiSQL wahlweise in MySQL, PgSQL oder MSSQL.
Das wiederum macht es sehr einfach abgelaufene Sessions zu loeschen und sorgt auch fuer ein wenig mehr Sicherheit fuer den Fall, dass mal jemand zufaellig /tmp ausliest, welches ja normalerweise die Heimat der Session-Files ist. Obwohl diese zusaetzliche Sicherheit auch wirklich nur marginal ist, denn in der Regel steht ja nur die UserID in der Session.
Der naechste Schritt wird sein dies in meiner Seite einzubauen, mit $_SESSION kann ich ja dann nicht weiterarbeiten sondern muss eben ueber die Klasse gehen.
Zusaetzlich hab ich nunmal endlich dafuer gesorgt, dass einer der aeltesten Codes meiner Seite rausfliegt, und zwar der der die UserID und das Passwort als Hash in einem Cookie speichert, denn sowas ist einfach nicht zeitgemaess.
Nun werden zwei IDs mittels uniqid() erstellt, diese zusammengewuerfelt und per crypt() verschluesselt. Dieser Wert wird dann im Cookie und in der Datenbank gespeichert.
Ein weiterer Schritt zur Absicherung wird sein sicherzustellen, dass die SessionID ueber den Anfangs eingestellten Mechanismus (Cookies oder URL) reinkommt. Wenn also bei der ersten Verbindung erkannt wird, dass Cookies angenommen werden dann werden bei diesem Client auch nur Cookies zur Uebergabe der SessionID akzeptiert, und umgekehrt.
All diese Massnahmen zusammen sollten dann fuer einigermassen brauchbare Sicherheit meiner Sessions sorgen.