Doppelte Session Cookie vergabe

Beliar

Grünschnabel
Hallo community! (das ist übrigens mein erster post)
Ich hätte da ein Problem :(
Zu dritt sollen wir für die Schule ein kleines Projekt realisieren, ich und ein zweiter programmieren das ganze.
Erst hatte ich ein simples login system geschrieben, mit einfachen cookies (per setcookie). Das funktionierte nicht ganz, der normale user konnte sich ein und ausloggen, aber der admin nicht mehr aus.

Auf einen rat hin habe ich das ganze auf sessions umgeschrieben, damit kenn ich mich aber nicht wirklich aus. Nun soll beim Login ein cookie gesetzt werden und das soll für den admin im ganzen Server gültig sein ("/") und für den User in "/user/".
So mach ich das:

PHP:
//Bissl code ist noch hier oben. (Aber keine Ausgabe! Der HTTP Header wurde noch nicht // verschickt)

if ( (isset($_POST['uname']) && isset($_POST['pw'])) && ($_POST['uname'] != "" && $_POST['pw'] != "")) {
		if ( ($pw = getMitarbeiterPW($_POST['uname'])) == NULL ) {
			// Error handling
		} else {
			if ( $pw == $_POST['pw'] ) {
				if ( $_POST['uname'] != $admin ) {
					 session_set_cookie_params(0,'/user/');
					 @session_start();
					 $_SESSION['loggedin'] = $_POST['uname'];
					 $cookieres = true;
					 $redirect = "http://localhost/user/index.php";
				} else if ( $_POST['uname'] == $admin ) {
					 session_set_cookie_params(0,'/');
					 @session_start();
					 $_SESSION['loggedin'] = $_POST['uname'];
					 $cookieres = true;
					 $redirect = "http://localhost/admin/index.php";
				}
			} else {

//restlicher code...

Seht ihr darin einen Fehler?
Denn der Client erhällt BEIDE cookies! Im Cookie Manager von Mozilla werden 2 aufgelistet. Beide heissten PHPSESSID und enthalten die gleiche ID, also den selben Value. Nur der Pfad unterscheidet sich, einer mit "/" und einer mit "/user/".

Ich hoffe ich hab mein Problem ausreichend erläutert, jetzt hoff ich mal das wer die Lösung kennt :D
Thx,
MFG Beliar
 
Nein daran kanns nicht liegen. Das hab ich sozusagen als verzweiflungstat gemacht, kurz bevor ich hier gepostet habe. Vorher stand nur 'else' da.
Ausserdem wir beim ersten mal auf ungleichheit geprüft, also ob der username nicht "admin" lautet. Der else if block wird dagegen ausgeführt wenn der username "admin" lautet.
 
Hi,

wichtig ist, dass Du beim Ausloggen ein session_destroy aufrufst, damit die Session ungültig wird.
Am besten Du ruftst auch direkt vor dem Login ein Session_destroy auf:

if ( ($pw = getMitarbeiterPW($_POST['uname'])) == NULL ) {
// Error handling
} else {
session_destroy();
session_start();

Dann kannst Du dir sicher sein, dass kein User als Admin und kein Admin als User eingeloggt sein kann. Da Du mit Client-Cookies arbeitest, mußt Du evtl. auch noch den Inhalt des Cookies überschreiben. Das weiß ich aber nicht genau.
 
Also nach dem aufruf der Seite die die Cookies setzt, wird eine seite geladen. Danach sind die 2 cookies gesetzt. Denn wenn man ein cookie setzt ist das soweit ich weiss erst nach einem refresh gesetzt.
Ausserdem hab ich vor dem Testlauf _alle_ cookies gelöscht, es kann gar kein user mehr eingeloggt gewesen sein.

Weiters ist ein Aufruf von session_destroy() vor dem initialisieren einer session oder dem weider aufnehmen einer session mit session_start() nicht gültig und führt zu einem fehler. Ist ja klar, wie kann was gelöscht werden was es nicht gibt.

Aber trotzdem danke :(
 
Hallo nochmal,
also ich hab das Problem weiter eingegrenzt. Und zwar wenn ich nur...

PHP:
if ( $_POST['uname'] != $admin ) {
                     session_set_cookie_params(0,'/user/');
                     @session_start();
                     $_SESSION['loggedin'] = $_POST['uname']; 
}

...schreibe, dann setzt er trotzdem 2 cookies.
Ich hatte da so einen verdacht und hab "session_set_cookie_params(0,'/user/');" auskommentiert. Da liegt auch das Problem. Statt die Cookie Parameter zu ändern für das Cookie das mit session_start() gesetzt wird legt dieser Befehl anscheinend selbst ein cookie an. Und das hat dann Path="/user/". Aber diese Zeile muss vor session_start() stehen. session_start alleine legt ein cookie mit Path="/" an, also mit Standard konfiguration. Wenn ich die zeile mit dem cookie params jetzt nach session_start() schreibe (was man ja eigentlich net darf/kann) bringt das nix und es kommt das selbe raus als würde nur session_start da stehen :(

Also, WTF?

MFG Beliar

EDIT:
Anscheinend muss man session_set_cookie_params vor JEDEM start oder wiederaufnehmen einer session aufrufen! Ja kann mir einer erklären wie ich das machen soll? Wenn das vor start session aufgerufen werden muss kann ich den user namen nicht überprüfen, und wenn ich den pfad jedesmal per get übertrage kann ja einer einfach in der URL das ändern und hat admin rechte. Damit wäre ja das ganze System umsonst x(
 
Zuletzt bearbeitet:
Zurück