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):
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 ...
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: