[PHP] Session ohne Cookies

  • #1
J

JediMB

Bekanntes Mitglied
Themenersteller
Dabei seit
04.04.2003
Beiträge
244
Reaktionspunkte
0
Hallo!

Ich habe für meine Seite (Entwurf unter www.jedimb.de) ein fesches Login-Skript gebaut, das mit Sessions arbeitet und es bei Bedarf auch ermöglicht, dass man mittels eines Cookies über die Session hinaus angemeldet bleibt.
Das ganze funktioniert prinzipiell auch wunderbar, allerdings liegt die Seite derzeit noch auf Webspace für den bei den Standardeinstellungen des Internet Explorers Cookies blockiert.
Das heißt: mit Firefox funktioniert alles wunderbar, beim Internet Explorer ist die Session allerdings nach einem Link-Click wieder verloren.
Soweit ich das bisher verstanden habe wird die Session standardmäßig über einen Cookie erhalten, bei Bedarf auch über die URL. Da nun das Standardhandling offenbar wegen nicht akzeptierter Cookies nicht funktioniert, suche ich nach einer anderen Möglichkeit.
Die Übergabe der Session-ID per Formular/URL sehe ich noch etwas skeptisch, da ich auch verschiedene Formulare in der Seite verwende und so ja bei jedem Link/Formularaufruf die SID mitgeben müßte, oder?

Jemand eine Idee, was ich da machen kann?

MfG
 
  • #3
Joa, durch die PHP Maual hab ich mich eben auch schon mal durchgearbeitet.
Und in dem Beispiel sieht das an sich so ähnlich aus, wie auch bei mir.

Deswegen wurndert mich das etwas.
Wenn ich mit dem IE auf die Seite gehe, dann kann ich mich einloggen und werde nach dem ersten Click wieder ausgeloggt. Außerdem gibt's dann eine neue Session-ID (mittels PHP die Konstante->SID' ausgegeben).
Schalte ich nun aber Cookies für die Seite ein (Internetoptionen -> Datenschutz -> Sites -> Erlauben), dann funktioniert der Login einwandfrei und ich bleibe auch eingeloggt.

Ich starte die Session am Anfang meiner Seite, die erste Zeile ist session_start().
Weiter habe ich ein Log-In Formular eingebaut. Wird dieses submitted, dann erkennt mein Login-Include das (es prüft die->$_REQUEST's des Formulars) und setzt per $_SESSION['titel'] = wert; einige Daten, z.B. eine Userid und einen Usernamen.

Es ist mir echt ein Rätsel, was da schief läuft...
 
  • #4
Ein bissle Quellcode sagt mehr als 100 Worte ;)

edit:

Gibts für deine Seite ein Testlogin, evtl. liegts ja gar nicht am Script ;)
 
  • #5
Na daran soll es nicht scheitern.
Ist etwas gekürzt und an einigen Stellen vereinfacht, aber der Aufbau sieht so aus:
Code:
<?php /* NORMALER LOGIN */
if($_REQUEST['action'] == login) { /* Login durchführen */ 
		$username = $_REQUEST['username'];
		$passwd = $_REQUEST['password'];
		/* Falscheingaben prüfen und abfangen */
		if(strlen($username)<1 || $username==username) { $fehler .= Fehler: Bitte geben Sie einen Benutzernamen ein!<br>\n; }
		if(strlen($passwd)<1 || $passwd == md5(password)) { $fehler .= Fehler: Kein Paßwort angegeben!<br>\n; }
		
		$sql_login = SELECT * FROM table WHERE name =->$username' AND password =->$passwd' ;
		if ($res_login = mysql_query($sql_login)){
			if($row = mysql_fetch_array($res_login)) {
				$loginOK = true;
					$id = 		$row['id'];
					$username = 	$row['username'];
					$_SESSION['id'] = 	 $id;
					$_SESSION['username'] = $username;
				$nachricht .= Login erfolgreich.<br>\n;
				if($_REQUEST['staylogged'] == staylogged) {		
					$cookielifetime= time()+3600*24*31*2;
					if(!(setcookie(login, $username, $cookielifetime))) {
						$fehler .= Cookie konnte nicht gesetzt werden.<br>\n;
					}
					$_COOKIE['login'] = $username;
					$_COOKIE['login_data'] = ; // verschlüsselt das PW abgelegt
				}
			} else { $fehler = Fehler: Falsche Benutzer/Passwort-Kombination!<br>\n; }
		} else { $fehler = Fehler: Ein interner Datenbankfehler ist aufgetreten.; }
 /* ENDE Login durchführen */ } else if($_REQUEST['action'] == logout) { 
	 /* Logout durchführen */
			$_SESSION['id'] = 	 NULL;
			$_SESSION['username'] = NULL;
		session_destroy();
		$cookielifetime= time()-3600*24*31;
		$_COOKIE['login'] = none;
		$_COOKIE['login_data'] = empty;
		if(!(setcookie(login, none, $cookielifetime) &&
		  setcookie(login_data, empty, $cookielifetime))) { $fehler .= Cookie konnte nicht entfernt werden!; }
	 /* ENDE Logout durchführen */ }

/* LOGIN DURCH GESETZTEN COOKIE */
 if(isset($_COOKIE['login']) && isset($_COOKIE['login_data'])) { /* Auf gesetzen Cookie überprüfen */
	$username = $_COOKIE['login'];
	$passwd = ; // (verschlüsselt aus Cookie aus cookie)
	$sql_login = SELECT * FROM table WHERE name =->$username' AND password =->$passwd' ;
		
	if ($res_login = mysql_query($sql_login)){
		if($row = mysql_fetch_array($res_login)) {
			$loginOK = true;
				$id = 		$row['id'];
				$username = 	$row['username'];
				$perm = 		$row['perm'];
				$first = 		$row['first'];
				$last = 		$row['last'];
				$mail = 		$row['mail'];
				$_SESSION['id'] = 	 $id;
				$_SESSION['username'] = $username;
				$_SESSION['perm'] = 	 $perm;
				$_SESSION['first'] = 	 $first;
				$_SESSION['last'] = 	 $last;
				$_SESSION['mail'] = 	 $mail;
		} 
	} 
/* ENDE Auf gesetzten Cookie überprüfen */ } ?>
 
  • #6
Als Test-Zugang kann ich Dir den Usernamen->gast' mit passwort->wingast' anbieten.
Wie gesagt: mit Firefox funktioniert es einwandfrei, auch wenn ich im Internet Explorer Cookies für die Seite explizit zulasse. Nur wenn Cookies von funpic.de nicht zugelassen sind, dann wird man sofort wieder->rausgeworfen...
 
  • #7
Probiers mal so:

Hab den 1. Teil ein wenig abgeändert.
Code:
<?php /* NORMALER LOGIN */
session_start();

if($_REQUEST['action'] == login) { /* Login durchführen */
	
	# Fehlermeldung per Default = false
	$fehler = false;
	
	$username = $_REQUEST['username'];
	$passwd = $_REQUEST['password'];
	
	/* Falscheingaben prüfen und abfangen */
	if(strlen($username)<1 || $username==username) { 
		$fehler .= Fehler: Bitte geben Sie einen Benutzernamen ein!<br>\n; 
	}
	if(strlen($passwd)<1 || $passwd == md5(password)) { 
		$fehler .= Fehler: Kein Paßwort angegeben!<br>\n; 
	}

	$sql_login = SELECT * FROM table WHERE name =->$username' AND password =->$passwd' ;
	if ($res_login = mysql_query($sql_login)){
		if($row = mysql_fetch_array($res_login)) {
			$loginOK = true;
			$id = $row['id'];
			$username = $row['username'];
			$_SESSION['id'] =  $id;
			$_SESSION['username'] = $username;
			$nachricht .= Login erfolgreich.<br>\n;
			if($_REQUEST['staylogged'] == staylogged) {
				$cookielifetime= time()+3600*24*31*2;
				if(!(setcookie(login, $username, $cookielifetime))) {
					$fehler .= Cookie konnte nicht gesetzt werden.<br>\n;
				}
				$_COOKIE['login'] = $username;
				$_COOKIE['login_data'] = ; // verschlüsselt das PW abgelegt
			}
			
		} 
		else { 
			$fehler = Fehler: Falsche Benutzer/Passwort-Kombination!<br>\n; 
		}
	} 
	else { 
		$fehler = Fehler: Ein interner Datenbankfehler ist aufgetreten.; 
	}
	
    # Keine Fehler, also die Seite mit SID reloaden
	if($fehler === false) {
		header(Location: index.php?.SID); 
	}
	/* ENDE Login durchführen */ 
} 
.....
.....
.....
?>

!!! evtl. Location anpassen ;)

PS, muss jetzt mal für ne Stunde weg, kannst ja schon mal probieren.
 
  • #8
Also da seh ich jetzt im Schnitt nicht sooo viel Unterschied, mal abgesehen vom session_start();, das bei mir schon früher kommt und abgesehen vom header(Location: index.php?.SID);.
Letzteres brauche ich aber eigentlich nicht, da der Login-Teil bei mir in die index.php includiert ist und nur dann ausgeführt wird, wenn tatsächlich das Login-Formular submitted wurde.

Sprich: index.php mit Login-Formular -> bei Submit verweis auf index.php und ausführen des geposteten Login-Includes -> fertig!

Brauche ich da noch eine Umleitung, damit die Session erhalten wird?
 
Thema:

[PHP] Session ohne Cookies

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.959
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben