SESSION Daten unsicher

Callboy

Mitglied
Hallo Leute,

weiß nicht ob ich es richtig beschreiben kann aber ich versuch es.
Ich habe ein Login System via Sessions perfekt gelöst aber mein Problem ist es einfach die, wenn ich die Seite geschlossen habe oder den Link wehrend ich eingeloggt bin an einem Kollegen als Kopie übergeben habe, bekommt er meine Daten zu sehen oder wenn ich die Seite nochmals aufrufe bin ich dennoch eingeloggt.

Kann mir jemand da Helfen ?
Ich habe reichlich hier einige Threads angeschaut aber nichts geeignetes gefunden.

Würde mich auf jede Hilfe sehr freuen

MfG
Daniel
 
Es ist sicherer, die Sitzungs-ID per Cookie zu mitzuführen und diese regelmäßig zu wechseln. Gerade bei einer Benutezrauthentifizierung ist das ratsam.

Sollte die Sitzungs-ID dennoch in fremde Hände gelangen, ist es sinnvoll, die Sitzung zusätzlich an weiter Merkmale wie etwa die User-Agent-Kennung zu binden. Hier sollte dann allerdings bei Nicht-Übereinstimmung nur eine neue Sitzung zugewiesen werden, die alte jedoch nicht entwertet werden. Als Ansatz kannst du dabei folgendes Beispiel nehmen:
PHP:
session_start();
// prüft die Authentizität des User Agent
if (!isset($_SESSION['USER_AGENT_FINGERPRINT'])) {
	$_SESSION['USER_AGENT_FINGERPRINT'] = session_user_agent_fingerprint();
} else if ($_SESSION['USER_AGENT_FINGERPRINT'] != session_user_agent_fingerprint()) {
	session_regenerate_id();
	$_SESSION = array();
	$_SESSION['USER_AGENT_FINGERPRINT'] = session_user_agent_fingerprint();
}
// sorgt dafür, dass eine Sitzungs-ID spätestens nach 10 Minuten getauscht wird
if (!isset($_SESSION['CREATED'])) {
	$_SESSION['CREATED'] = time();
} else if ($_SESSION['CREATED'] > time() - 36000) {
	session_regenerate_id(true);
	$_SESSION['CREATED'] = time();
}
Die nicht dokumentierte session_user_agent_fingerprint()-Funktion sollte dabei einen auf Basis der vom User Agent gelieferten Infromationen erzeuten digitalen Fingerabdruck liefern.
 
Das Problem wird hier in sehr vielen Threads besprochen.
Zunächst mal die Frage: Warum übergibst du die Session-ID per URL / $_GET?

Desweiteren was geeignetes hier in den zwei Themen:
http://www.tutorials.de/forum/php/321933-problem-mit-login-check-script.html
http://www.tutorials.de/forum/coder...hen-cookies-w3c-wai-css-js-2.html#post1649362

Hallo ZodiacXP,

ich danke für die schnelle Antwort.
Nein ich übergebe weder noch die Session ID per URL / $_GET...
Ich habe eine Session und Auth... Klasse geschrieben.
Mit der Auth... Klasse überprüfe ich ob die authorisierung geklappt hat, falls ja wird eine login hash in die Session geschrieben.
Damit schaue ich bzw. überprüfe ich zusätzlich ob die Login geklappt hat und noch existiert.
Hoffe ich konnte es verständlich beschreiben.

Danke für die Links, werde es in kürze mal austesten.

Gruß
Daniel
 
Es ist sicherer, die Sitzungs-ID per Cookie zu mitzuführen und diese regelmäßig zu wechseln. Gerade bei einer Benutezrauthentifizierung ist das ratsam.

Sollte die Sitzungs-ID dennoch in fremde Hände gelangen, ist es sinnvoll, die Sitzung zusätzlich an weiter Merkmale wie etwa die User-Agent-Kennung zu binden. Hier sollte dann allerdings bei Nicht-Übereinstimmung nur eine neue Sitzung zugewiesen werden, die alte jedoch nicht entwertet werden. Als Ansatz kannst du dabei folgendes Beispiel nehmen:
PHP:
session_start();
// prüft die Authentizität des User Agent
if (!isset($_SESSION['USER_AGENT_FINGERPRINT'])) {
	$_SESSION['USER_AGENT_FINGERPRINT'] = session_user_agent_fingerprint();
} else if ($_SESSION['USER_AGENT_FINGERPRINT'] != session_user_agent_fingerprint()) {
	session_regenerate_id();
	$_SESSION = array();
	$_SESSION['USER_AGENT_FINGERPRINT'] = session_user_agent_fingerprint();
}
// sorgt dafür, dass eine Sitzungs-ID spätestens nach 10 Minuten getauscht wird
if (!isset($_SESSION['CREATED'])) {
	$_SESSION['CREATED'] = time();
} else if ($_SESSION['CREATED'] > time() - 36000) {
	session_regenerate_id(true);
	$_SESSION['CREATED'] = time();
}
Die nicht dokumentierte session_user_agent_fingerprint()-Funktion sollte dabei einen auf Basis der vom User Agent gelieferten Infromationen erzeuten digitalen Fingerabdruck liefern.

Hallo Gumbo,

ich danke dir ebenfalls für die Hilfe.
Dein Beispiel klingt sehr verloggend aber kann mit der Funktion "session_user_agent_fingerprint()" echt nichts anfangen.

Was genau meinst du damit und was soll diese Funktion machen ?
Ich meine okay du hast es erläutert aber konnte das echt nicht verstehen.

Könntest du mir da etwas genauer Helfen ?

Gruß
Daniel
 
Diese Funktion soll einen für den User Agent eindeutigen Fingerabdruck erzeugen. Als Quelle kannst du Informationen wie etwa die User-Agent-Kennung und ähnliche verwenden. Beispielsweise:
PHP:
function session_user_agent_fingerprint($tokens=null)
{
	if (!is_array($tokens)) {
		$tokens = array(
			&$_SERVER['HTTP_USER_AGENT'],
			&$_SERVER['HTTP_ACCEPT'],
			&$_SERVER['HTTP_ACCEPT_CHARSET'],
			&$_SERVER['HTTP_ACCEPT_ENCODING'],
			&$_SERVER['HTTP_ACCEPT_LANGUAGE'],
		);
	}
	$fingerprint = '';
	foreach ($tokens as $token) {
		$fingerprint .= md5($token);
	}
	$fingerprint = md5($fingerprint);
	return $fingerprint;
}
Über die tatsächlich sinnvollen Informationen kann allerdings noch gestritten werden, da sie bei manchen von Anfrage zu Anfrage variieren können. Aber dafür ist der optionale Parameter da.
 
Diese Funktion soll einen für den User Agent eindeutigen Fingerabdruck erzeugen. Als Quelle kannst du Informationen wie etwa die User-Agent-Kennung und ähnliche verwenden. Beispielsweise:
PHP:
function session_user_agent_fingerprint($tokens=null)
{
	if (!is_array($tokens)) {
		$tokens = array(
			&$_SERVER['HTTP_USER_AGENT'],
			&$_SERVER['HTTP_ACCEPT'],
			&$_SERVER['HTTP_ACCEPT_CHARSET'],
			&$_SERVER['HTTP_ACCEPT_ENCODING'],
			&$_SERVER['HTTP_ACCEPT_LANGUAGE'],
		);
	}
	$fingerprint = '';
	foreach ($tokens as $token) {
		$fingerprint .= md5($token);
	}
	$fingerprint = md5($fingerprint);
	return $fingerprint;
}
Über die tatsächlich sinnvollen Informationen kann allerdings noch gestritten werden, da sie bei manchen von Anfrage zu Anfrage variieren können. Aber dafür ist der optionale Parameter da.

Wow das ging ja aber schnell *freu...
Ah verstehe jetzt wie es gemeint ist...

Habe noch eine frage:
Der $token ist in dem fall jetzt die sessionid ?
Das mit dem & Operator, wenn ich mich nicht täusche ist eine Referenz ?
Wenn ja, was ist der Grund oder Sinn bzw. warum musste es so gemacht werden ?
Sorry aber das mit dem & Operator habe ich nicht ganz verstanden.

Würde mich auch hierbei sehr freuen, wenn ihr mir Helfen könnt

Gruß
Daniel
 
Hallo Gumbo,

ich habe dein Beispiel nun getestet und bekomme eine Fehlermeldung.
Code:
Warning: session_regenerate_id() [function.session-regenerate-id]: Cannot regenerate session id - headers already sent in C:\xampp\htdocs\chs\admin\index.php5 on line 116

Kann leider damit nichts anfangen.
Wie muss ich da vorgehen ?
Bitte um Hilfe

Gruß
Daniel
 
Der &-Operator ist tatsächlich der Referenzoperation und in diesem Fall ein Trick, um Fehlermeldungen bei möglicher Nichtexistenz der Variablen zu vermeiden. Denn gerade von außen kommende Werte sollten vorher geprüft werden, ob sie tatsächlich vorhanden sind. Existiert die Variable nicht, wird null als Wert übernommen.

Für die genannte Fehlermeldung, siehe [thread=302188]Häufig auftretende Fehler[/thread].
 
Hallo Gumbo,

danke für die sehr Hilfreiche Link und der erklärung.
Habe diese Fehlermeldung behoben aber allerdings funktioniert das überhaupt nicht.

Ich habe das Fenster geschlossen, während ich eingeloggt war und habe die Seite nochmal aufgerufen und ich war eingeloggt ohne das ich nochmal mich einzuloggen musste.
Desweiteren habe ich das Problem genau so, wenn ich das Link kopiere und meinem Kollegen weiter reiche - sieht er ebenfalls mein Account und ist mit meinem Account eingeloggt.

Wie kann ich das ganze was ich oben geschildert habe umgehen ?
Bitte um Hilfe

Gruß
Daniel
 
Zurück