Eigener SessionHandler

HansSarpei

Grünschnabel
Hallo,

ich habe mir einen eigenen SessionHandler erstellt. Dabei gibt es jedoch ein Problem, es ist möglich, sich eine SessionID nach Wunsch zu erstellen, sprich der Benutzer ruft die Seite über index.php?sid=Bla auf und hat von nun an die SessionID 'bla'.

Sofern eine Session ID vorhanden ist, wird überprüft, ob diese in der Datenbank existiert, sofern diese nicht existiert, wird eine neue generierte, die nun als Session ID verwendet wird.

Zur Klarheit, einfach 2 Beispiele:

Benutzer ruft die Seite mit der SessionID 'Bla' auf, 'Bla' existiert nicht in der Datenbank, es wird neue SessionID generiert, 'NeueID', diese wird nun für den Benutzer in der Datenbank gespeichert.

Benutzer ruft die Seite mit der SessionID 'ID' auf, 'ID' existiert in der Datenbank, es wird keine neue SessionID generiert, Benutzer behält die ID.

Hier der entsprechende PHP Code (vereinfacht):
PHP:
	public function read($sessionID) {
		// Select session
		$sql = "SELECT	*
				FROM	session
				WHERE	sessionID = :ID ;";
		$statement = Core::getDB()->prepareQuery($sql);
		
		// Bind value and execute
		$statement->bindValue('ID', $this->getSessionID());
		$statement->execute();
		
		// Create new id if not found
		if (!$statement->getAffectedRows()) {
			// Create and return empty data
			$this->createNewSession();
			return '';
		}
		
		// Get match
		$session = $statement->getFirstMatchAsObject();
		
		// Set real session id
		session_id($session->sessionID);
		
		// Return data
		return $session->sessionData;
	}

	protected function createNewSession() {
		session_regenerate_id(); // liefert false
		session_unset();
		
		// Build query
		$sql = "INSERT INTO	session
							(sessionID,
							 sessionData,
							 userIP,
							 userBrowser,
							 generationTime,
							 lastActivity)
				VALUES		(:ID,
							 :DATA,
							 :IP,
							 :BROWSER,
							 :TIME,
							 :TIME);";
		$statement = Core::getDB()->prepareQuery($sql);
		
		// Bind values
		$statement->bindValue('TIME', TIME_NOW, 'i');
		$statement->bindValue('BROWSER', StringUtility::short(ContentManager::getBrowser(), DATABASE_BROWSER));
		$statement->bindValue('DATA', '');
		$statement->bindValue('ID', session_id());
		$statement->bindValue('IP', ContentManager::getIP());
		
		// Remember cookie id
		if (DataUtility::shouldUseCookies()) {
			DataUtility::useCookie(SESSION_NAME, session_id());
		}
		
		// Execute statement and return
		return $statement->execute();
	}

Das Problem ist nun aber, das mir session_regenerate_id() keine neue ID liefiert, sondern die alte ID erhalten bleibt, sprich um auf die beiden Beispiele zurück zu kommen, im ersten Beispiel würde die SessionID 'Bla' lauten und nicht 'NeueID', folglich kann man sich, wie oben angesprochen IDs mit Wunschnamen erzeugen ...

Im Code habe ich auch die Stelle hervorgehoben, dort liefert mir auch die Funktion session_regenerate_id() false und nicht true, was sie eigentlich sollte, hat einer eine Idee voran das ganze liegen könnte, wo dort der Fehler ist?

EDIT: Ich hätte fast vergessen zu sagen, das dass Problem nur Auftritt, wenn ich meine Session umbenennen will, lasse ich das ohne session_name('SID') laufen, gibt es bei mir keine Probleme und ich bekomme eine neue session_regenerate_id(), trotzdem liefert mir die Funktion session_regenerate_id() false.

Falls benötigt kann ich auch den kompletten SessionHandler reinstellen ...
 
Zuletzt bearbeitet:
Hi,

ich habe mit session_regenerate_id() noch nicht gearbeitet, aber es gibt laut Dokumentation einen Parameter, der die alte Session löscht. Evtl. funktioniert es nur, wenn du als Parameter ein TRUE übergibst?
 
session_regenerate_id() generiert dir, im Normalfall, eine neue Session ID und löscht, je nach Wert des Parameters die alte Session. Mir ging es aber ehr um den Rückgabewert, nicht dem Parameter. Der Rückgabewert sollte true liefern, sofern alles funktionierte, mir liefert der Wert aber false und wie gesagt, sofern ich zuvor den Namen der Session geändert habe, liefert die Funktion mir keine neue ID, erhalte jedoch auch keinen Fehler, trotz entsprechend hohem report_level
 
Lösung des Problems: Ich habe den Handler und die Vergabe der ID zusammen gepackt (in den Handler) und diese Verwaltung, und somit auch session_regenerate_id() funktioniert nicht im Handler, irgendwie auch logisch, daher habe ich den reinen Handler erstellt, laden, speichern der Session Daten und einen Manager, welcher überprüft, ob dies die korrekte ID ist, bzw. ob der Benutzer überhaupt diese ID verwenden darf.
 
Zurück