PHPSESSID wird nicht übergeben

matzseesi

Erfahrenes Mitglied
Hi Leute

Ich habe folgendes Problem:

Bisher habe ich meine Seite so programmiert dass mit folgendem Code unterschieden wird ob ein User eingloggt ist oder nicht!

PHP:
if ((isset($PHPSESSID))&&(isset($SES_grade)))
{
 // Interner Bereich
}

Jetzt habe ich meine Seite auf einen anderen Webserver getan und jetzt funktioniert diese Abfrage nicht mehr! Deshalb musst ich die Loginabfrage auf folgendes kürzen

PHP:
if(isset($SES_userid))
{
 // interner Bereich
}

Warum kennt er die PHPSESSID Variable nicht? in der PHP Ini ist sie genau so definiert! Achja noch etwas: in der URL übergebe ich diese nicht!

Grüße Matz
 
Versuchs mal mit folgender Systemfunktion:
session_id();

Die liefert dir die aktuelle Sessionvariable zurück.
Das ist hilfreich, wenn du z.B. mit header() arbeitest und der User Cookies nicht aktiviert hat:

header('location: test.php?PHPSESSID='.session_id());

Damit geht Dir die Session zwischen zwei Seiten nicht flöten..

LG
Mike
 
Mal andere Frage wenn ich mit der Funktion session_id() arbeite dann ist diese ja nur gesetzt wenn ich session_start() am anfang der seite mache oder?

sprich ich habe meine Login page da ist doch auch ein session start oder?
also ist die überprüfung eigentlich ziemlich sinnlos oder?

Wie könnte man den Login sicherer gestalten als einfach nach einer von mir gesetzten Session Variable zu schauen?

Desweiteren wollte ich fragen ob ich das session_start immer brauche oder nur im eingeloggten status? denn ich habe bisher das session_start() auch im externen bereich gemacht, sprich auch bei der Login page!

Grüße Matz
 
Prinzipiell würde ich die Session immer starten... Dafür könntest Du Dir eine nette Methode schreiben, die das für dich macht.

Ich würde auch nicht abfragen, ob die Session exisitert (das sollte sie am besten immer), sondern ob die Sessionvariable einen Inhalt hat.

Und sehr elegant ist es, wenn Du die Sessions als Array definierst. Ich verwende die Session z.B. auch wenn eine Variable über mehrere Seiten laufen muss, bevor Sie in der Datenbank landet. Einfach deshalb, weil du mit dem URL Query auf 1024 Zeichen beschränkt bist und zusätzlich gibts noch das Problem mit Sonderzeichen.

Beispiel: Ich möchte sämtliche Daten eines autos in meiner DB ablegen, die Dateneingabe erfolgt auf mehreren Seiten:
Ich habe dann eine Array-Sessionvariable die heißt "sess_auto_create".
Auf der ersten Seite lege ich dann folgende Array-Felder an:
$sess_auto_create['marke']=$marke;
$sess_auto_create['name']=$name;
$sess_auto_create['beschreibung']=$beschreibung;

Diese Variable wird dann über alle Eingabeseiten mitgezogen und ich kann sie dann bequem an die Methode zum Schreiben in die DB übergeben. (daher auch das vorherige Beispiel mit header().)

Genauso habe ich auch eine Variable "$sess_user" mit dem Feld "['username']" oder "['rechte']. Und diese Session-Variable wird bei jedem Seitenaufruf gestartet.

Damit hast Du auch kein Problem mit dem Timeout der Session (wenn Du sie nur einmal beim Login initialisierst und startest, wird der User nach wenigen Minuten wieder rausfliegen, da der Session Timestamp nicht neu gesetzt wurde.

Hoffe ich habs nicht zu kompliziert erklärt,
LG
Mike
 
Ich habe beim Login ein skript das schreibt mir die rechte den namen und das Passwort in eine Session Var. danach überprüfe ich immer ob eben die rechte und der Benutzername als Session Variable gesetzt ist! ich schreibe aber die Variable nie neu!

Desweiteren mach ich am seiten anfang immer ein session_start , ein session_name und ein session_set_cookie_parrams ist das sinnvoll?

Grüße Matz
 
matzseesi hat gesagt.:
Ich habe beim Login ein skript das schreibt mir die rechte den namen und das Passwort in eine Session Var. danach überprüfe ich immer ob eben die rechte und der Benutzername als Session Variable gesetzt ist! ich schreibe aber die Variable nie neu!

Desweiteren mach ich am seiten anfang immer ein session_start , ein session_name und ein session_set_cookie_parrams ist das sinnvoll?

Grüße Matz
Bei mir sieht das ganze so aus: (Die Klasse wird über einen eigenen Classloader in jedem File instanziert)

Initialisierung:
PHP:
class sessions
{
	// KONSTRUKTOR
    function sessions()
	{
		session_start();
		if(!session_is_registered('sess_sysuser')) {
			session_register('sess_sysuser');
		}

	}
}

Das ist es eigentlich in gekürzter Form.

Und dann gibts noch eine Klasse, die mir bei jeder Seite die Prüfung durchführt:

Prüfung:
PHP:
class sysbenutzer
{
	// KONSTRUKTOR
    function sysbenutzer(&$class_main)
	{
		$this->_db = &$class_main->_db;
		$this->main = &$class_main;
	}

	function Logout()
	{
		global $sess_sysuser;
		$sess_sysuser="";
		session_unregister("sess_sysuser");
		$_SESSION = array();
		session_destroy();
		header('location: admin_login_required.php');
	}
	
	function IsLoggedin()
	{
		global $sess_sysuser;
		if ($sess_sysuser<>'' and session_is_registered('sess_sysuser')) {
			return true;
		} else {
			return false;
		}
	}
	
	function IsAuthorized($required_usertyp)
	{
		global $sess_sysuser;
		$authorized=false;
		$container_sysuser=$this->GET_Sysuser_Details($sess_sysuser);
		$required_usertyp = explode("|", $required_usertyp);
		foreach ($required_usertyp as $value) {
			if ($container_sysuser[1]['fk_sysuser_typ_id']==$value) {
				$authorized=true;
			}
		}
		return $authorized;
	}
}

Damit hab ich jederzeit die beiden wichtigen Methoden login() und logout() zur Verfügung.
Aber es gibt hier mehrere verschiedene Möglichkeiten. Ist wahrscheinlich geschmackssache. Mit dieser Lösung arbeite ich schon ne weile und sie hat sich bisher als Wasserdicht erwiesen (natürlich nur wenn ich davon ausgehe, dass niemand die Sessions am Server faken kann :-) ). Aber dann hat man sowieso ein gröberes Problem...

LG
Mike
 
Zurück