Codeschnipsel
Eigene Sessionverwaltung
gw.session.core//gw.session.sqlite
Benötigt PHP5.1, besser 5.2 sowie die SQLite-Extension
Auf Grund einiger Entwicklungen für Bekannte, ist nun eine einfache, aber doch sehr flexible Sessionverwaltung zustande gekommen, die sich nicht verstecken muss.
Die Frage die sich als erstes stellt ist, warum eine eigene Sessionverwaltung? Nun ja, diese Frage stellt sich jeder, aber eines sei gesagt, eine eigene Sessionverwaltung ist meistens Flexibler und einfacher zu erweitern, als die von PHP selbst. So kann man hier eine Session eindeutig einem Benutzer zuordnen und so eine Abfrage tätigen, die Session + Benutzerdaten auf einmal holt und diese sogar gleichzeitig flexibler überprüfen. Auch entfallen bei bestimmten Aktionen wie einer „Wer ist Online“-Liste Abfragen wie das Eintragen der Benutzer die Online sind, und auslesen. Dies kann hier relativ einfach passieren, da man die Benutzer nicht mehr eintragen muss, sondern nur noch die laufenden Sessions abfragen muss, dies ist mit der PHP-Session so nicht möglich.
Zudem kommt es bei der PHP-Session immer auf die Einstellung in der INI-Datei an. Werden Cookies gesetzt, wenn nicht, wird es automatisch an die Links angehängt oder muss man es selbst machen?
Durch diese Einstellung ergeben sich oft manchmal sehr unschöne Links wie: index.php?, index.php?param=value& oder ganz schlimm, falls PHP den Links automatisch den GET-Parameter anhängt: index.php?phpsessionid=sessionid&phpsessionid=. Hier kommt also die schiere Einstellungsmöglichkeit zu tragen und kann unschönen Links führen.
Aber damit nicht genug, auch Überprüfungen wie IP-Überprüfung fehlt der PHP-Session und man muss sie nachprogrammieren, sowas kann man in einer eigenen Sessionverwaltung schnell und einfach einbauen, zudem ist die Session wesentlich einfacher zu bedienen. Sie kann zu jeder Zeit gestartet werden, selbst wenn eine Ausgabe bereits erfolgt, sie setzt in diesem Moment einfach nur den Cookie nicht.
Zudem kann man so selbst entscheiden wie die Daten gespeichert werden, als Datei in einem Ordner, in einer Datenbank oder sonst wo, die Sessionverwaltung ist also wesentlich flexibler was Speichern, holen, verwalten angeht, und richtig programmiert ist sie genau so sicher oder sogar noch sicherer als die PHP-Eigene Sessionverwaltung, auch wenn vielleicht unmerklich langsamer.
Zu der Aussage: Aber die SessionID von PHP sei sicherer. Leider muss ich hier sagen, laut Aussage von einigen Benutzern es bestimmte SessionIDs gibt dich sich häufiger wiederholen sollen. Ich habe daher Wert drauf gelegt eine SessionID zu bauen, die relativ Sicher ist und eben nicht erraten werden kann. Dazu kommt der MD5 Hash zu tragen, der einen Hast aus der Funktion uniqid zusammen mit microtime, der IP mit der die Session erstellt wurde, sowie dem Clienten des Benutzers. Dies sollte also relativ Sichersein und nicht zu erraten sein.
So, zu der Sessionverwaltung selbst. Die Sessionverwaltung ist im angehängten Archiv. Ihr benutzt einfach den Standard Ordner. Die Sessionverwaltung besteht momentan aus 3 Dateien und einem Ordner.
|
Die Datei session.class.php enthält die Standardkonstanten und definiert diese, falls dies noch nicht passiert und enthält die Grundklasse der Session, sowie die Klasse mit statischen Funktionen, die die Sessionklasse braucht, aber eventuell in späteren PHP-Versionen eine Anpassung. Diese Datei muss nicht eingebunden werden.
Die Datei SQLiteSession.class.php enthält eine fertige Sessionklasse, die sowohl die Speicherung und Laden der Sessiondaten übernimmt. Diese Datei bindet ihr in eure Scripts ein.
Der Ordner data braucht die CHMOD-Rechte 0755 oder eben 0777 (meistens reichen die CHMOD 0755, gehen diese nicht und es kommt zu Fehlern, werden die CHMOD 0777 benötigt.) Hier werden die Sessiondaten gepspeichert, und der Ordner ist mit einer .htaccess geschützt. Die SQLiteSession.class.php speichert ihr die SQLite-Datenbankdatei und legt diese falls nicht vorhanden automatisch an. Diese Datei dient dazu, alle Daten der Sessions dort zu speichern.
Für die Steuerung der Session, stehen verschiedenen Konstanten zu Verfügung:
SESSION_IPCHECK: Mit dieser Konstante steuert ihr den IP-Check, ob dieser auf eine Session angewendet werden soll. Diese Konstante hat noch keine Funktion, da die Funktion für den IP-Check noch nicht eingebaut ist. Diese folgt in einer späteren Version. Die Werte sind true und false.
SESSION_IPCOMPARE: Mit dieser Konstanten steuert ihr das Verhalten der IP-Prüffunktion, wie genau sie vorgehen soll. Zugelassene werte sind: 255.*.*.*, 255.255.*.*, 255.255.255.*, 255.255.255.255 Dies bestimmt wie genau die Blöcke einer IP-Adresse geprüft werden sollen. Der beste Kompromiss aus Sicherheit und flexibilität für Benutzer mit ständig wechselnden IPs ist 255.255.*.*
COOKIE_PREFIX: Mit dieser Konstanten könnt ihr einen Cookieprefix der dem Cookie angehängt wird bestimmen. Meist ist dies nicht erforderlich, außer ihr verwendet die Sessionklasse mehrfach für einen Benutzer.
Konstanten der Klassen selbst:
SESSION_PARAM: Diese Konstante ist in der Sessionklasse selbst vorhanden und enthält die Session-Parameterbezeichung, diese ist Standardmäßig auf s gestellt. Wollt ihr diese ändern, müsst ihr dies in der Klasse vornehmen.
Wie rufe ich die Session auf?
Ihr bindet als erstes eine fertige Sessionklasse ein, die session Klasse selbst ist eine Abstrakte Klasse, die nur nicht oder selten veränderbare Methoden enthält. Die Methoden sessionLoad und sessionUpdate sind als abstrakt deklariert und müssen in einer neuen Sessionklasse erstellt werden. Bei Datenbank basierenden Sessionverwaltungen muss die Methode __construct und sessionCreate erweitert werden. Hierfür schaut euch einfach die Methoden in der SQLiteSession an.
Für den Anfang bindet ihr also nur die SQLiteSession.class.php ein und ruft folgende statische Methode aus der session Klasse auf: startSession
|
Dieser könnten zwei Parameter übergeben werden. $type und $useCookie, letzteres wird der __construct Funktion der Sessionverwaltung übergeben und bestimmt ob Cookies verwendet werden sollen oder nicht, erstes bestimmt die eigentliche Sessionklasse. Beide Werte haben einen Standardwert. $type ist auf SQLite gesetzt, $useCookie auf true. $useCookie kann neben true auch den Wert false annehmen und ist dieser gesetzt werden anschließend keine Cookies mehr gesetzt. $type bestimmt, wie gesagt die eigentliche Sessionklasse. Diese ist Standardmäßig die von mir entwickelte SQLiteSession. Ihr selbst könnten einen FileSession Klasse erstellen, dann müsstet ihr für $type den Wert File übergeben.
Wie setze ich Werte?
Aus PHP kennt ihr folgenden Aufruf:
|
Dieser ändert sich nicht sehr, nur ist zu beachten, dadurch das es eine Klasse ist, greift man Auf Objekte wieder, diese werden zwar in der Klasse selbst in dem Objekt $sessionData gespeichert, welches ein Array ist, dieses ist aber auf protected gesetzt und kann nicht direkt angesprochen werden. Eine Zuweisung sieht daher wie folgt aus:
|
Und genau so greift ihr auch auf die Werte zurück:
|
Hier bei ist zu beachten, das folgenden Aufrufe in jeder Art und Schreibweise abgefangen werden: SessionID, sid. Diese geben Automatisch die SessionID der aktuellen Session wieder.
Konstanten die die Sessiondefiniert:
SESSION_INPUT_POST: enthält ein HTML-Input Feld des Types hidden, mit der SessionID. Kann gebraucht werden für wunderschöne Formulare, die mit der SessionID versehen werden sollen.
Wert: “<input type=“hidden“ name=“s“ value=“sessionID“ />“
SESSION_1ST_GET: enthält die SessionID als ersten Parameter eines Links. Ihr müsst also nur index.php schreiben und könnt daran die Konstante hängen.
Wert: ?s=sessionID
SESSION_2ND_GET: enthält die SessionID als einen folgenden Parameter für einen Link. Ihr könnt also einen Link schreiben: index.php?param1=value und könnt daran diese Konstante hängen.
Sollten Cookies gesetzt werden, und auch gesetzt werden können, sind diese Konstanten leer, sollten Cookies nicht gesetzt werden, weil ihr es nicht wollt oder eben sie nicht gesetzt werden können, enthalten diese Konstanten die genannten SessionIDs.
Wert: &s=sessionID
Desweiteren könnt ihr auf die SessionID wie folgt zugreifen:
|
Jetzt kommen wir zu etwas, was auf jedenfall aufgerufen werden muss, sollte eine Session erstellt worden sein. Am Ende des Scriptes muss die Methide sessionUpdate aufgerufen werden, da dies nun nicht mehr automatisch passiert.
|
Damit werden die Daten der Session aktualisiert.
Was noch fehlt: Eine Methode zum löschen/zerstören der aktuellen Session. Solltet ihr damit ein Loginsystem bauen, bietet es sich einfach an, eine Sessionvariabel zu setzten: $session->login = true, und diese nach dem Logout auf false zu setzten. Was ebenso fehlt ist die Funktion zur IP-Überprüfung. Beide Funktionen werden so bald wie möglich folgen.
Ich wünsche euch viel Spaß mit der Sessionverwaltung und habt keine Angst, diese Sessionverwaltung funktioniert auch ohne Datenbankserver, PHP muss nur die SQLite-Extension laden. Dies findet ihr relativ einfach raus, im Anhang ist dazu ein Bild, solltet ihr das in euer PHPInfo finden, könnt ihr die Sessionverwaltung ohne Probleme verwenden.
Kommentare
Autor Teralios