Verständnisproblem Cookies / Session Lifetime

Verständnisproblem Cookies / Session Lifetime

am 22.08.2006 10:15:20 von thomas

Hallo zusammen,

ich habe ein Verständnisproblem mit folgender Aufgabenstellung:

Eine Anwendung ist aus dem Intra- und Internet erreichbar. Aus dem
Intranet soll die Session solange gültig bleiben, wie der Browser
geöffnet ist. Aus dem Internet max. 5 Minuten, ausser der Benutzer
setzt innerhalb dieser Zeit eine Request - dann sollen die 5 Minuten
erneut anfangen.

Bei jedem Request wird folgende Code durchlaufen:

$ip =3D substr($_SERVER['REMOTE_ADDR'], 0,11);
if ($ip !=3D '127.0.0.1' && $ip !=3D '192.168.172' && $ip !=3D '192.168.176=
')
{
session_set_cookie_params(300);
}
session_start();

Bei Zugriffen aus dem Internet hat der Cookie eine Lebensdauer von 5
Minuten - leider wird diese nicht aktualisiert, wenn nach z.B. 4
Minuten eine neuer Request zu der Session kommt. Der Benutzer muss sich
stets nach 5 Minuten neu anmelden.

Habe ich an dieser Stelle den falschen Ansatz gewählt oder gibt es
einen Weg den Cookie zu aktualisieren?

Bin für jeden Hinweis dankbar,
Tom

Re: VerständnisproblemCookies / Session Lifetime

am 22.08.2006 14:54:19 von Sven Drieling

Thomas wrote:

Hallo,

> Bei Zugriffen aus dem Internet hat der Cookie eine Lebensdauer von 5
> Minuten - leider wird diese nicht aktualisiert,
>=20
> Habe ich an dieser Stelle den falschen Ansatz gewählt oder gibt es
> einen Weg den Cookie zu aktualisieren?

Das muss man AFAIK selbst machen. PHP schickt nur einmalig einen
Session-Cookie raus und aktualisiert diesen dann nicht mehr.
=20
session.use_cookies ausschalten und das Setzen des Session-Cookies
selbst verwalten. Eventuell sind dafür fertige Klassen zu finden.

Oder als Hack immer selbst=20
=20
setcookie(session_name(), session_id(), ...);
=20
aufrufen. Dabei darauf achten, dass es überall dieselben Parameter
(path, domain, ...) sind, die auch PHP beim ersten Start der Session
benutzt. Worin ein Problem dieses Hacks besteht - sollte aber
mit etwas Glück automatisch der Fall.


tschuess
[|8:)

Re: Verständnisproblem Cookies / Session Lifetime

am 22.08.2006 18:20:14 von thomas

Sven Drieling schrieb:

> Thomas wrote:
>
> Hallo,
>
> > Bei Zugriffen aus dem Internet hat der Cookie eine Lebensdauer von 5
> > Minuten - leider wird diese nicht aktualisiert,
> >
> > Habe ich an dieser Stelle den falschen Ansatz gewählt oder gibt es
> > einen Weg den Cookie zu aktualisieren?
>
> Das muss man AFAIK selbst machen. PHP schickt nur einmalig einen
> Session-Cookie raus und aktualisiert diesen dann nicht mehr.
>
> session.use_cookies ausschalten und das Setzen des Session-Cookies
> selbst verwalten. Eventuell sind dafür fertige Klassen zu finden.
>
> Oder als Hack immer selbst
>
> setcookie(session_name(), session_id(), ...);
>
> aufrufen. Dabei darauf achten, dass es überall dieselben Parameter
> (path, domain, ...) sind, die auch PHP beim ersten Start der Session
> benutzt. Worin ein Problem dieses Hacks besteht - sollte aber
> mit etwas Glück automatisch der Fall.
>
>
> tschuess
> [|8:)

Hallo Sven,

besten Dank für Deine Antwort.

Wäre es dann nicht einfacher, ich setzte den "Internet" Cookie auch
für die Lebensdauer des Browsers, merke mir in der Session die Uhrzeit
und aktualisiere diese bei Request und mache ein session_destroy() wenn
der Zeitunterschied zwischen den Requests größer als 5 Minuten ist?

Viele Grüße
Tom

Re: VerständnisproblemCookies / Session Lifetime

am 22.08.2006 19:42:59 von Sven Drieling

Thomas wrote:

Hallo,

> Wäre es dann nicht einfacher, ich setzte den "Internet" Cookie auch=

> für die Lebensdauer des Browsers, merke mir in der Session die Uhrz=
eit
> und aktualisiere diese bei Request und mache ein session_destroy() we=
nn
> der Zeitunterschied zwischen den Requests größer als 5 Minuten is=
t?

Sowas in der Art geht auch. Beendet wird eine Session aber eher mit
setcookie() als mit session_destroy(). Siehe Handbuch unter
session_destroy().


tschuess
[|8:)

Re: Verständnisproblem Cookies / Session Lifetime

am 24.08.2006 16:07:32 von thomas

Sven Drieling schrieb:

> Thomas wrote:
>
> Hallo,
>
> > Wäre es dann nicht einfacher, ich setzte den "Internet" Cookie auch
> > für die Lebensdauer des Browsers, merke mir in der Session die Uhrzeit
> > und aktualisiere diese bei Request und mache ein session_destroy() wenn
> > der Zeitunterschied zwischen den Requests größer als 5 Minuten ist?
>
> Sowas in der Art geht auch. Beendet wird eine Session aber eher mit
> setcookie() als mit session_destroy(). Siehe Handbuch unter
> session_destroy().
>
>
> tschuess
> [|8:)

Hallo Sven,

habe es nun so gemacht - funktioniert bestens.

Vielen Dank nochmals für Deinen Hinweis.

Gruß
Tom

if ($max_lifetime >=3D 0)
if ( (time() - $_SESSION['timestamp']) > $max_lifetime) {
doLog(INFO, 'akt_timestamp: ' . time());
doLog(INFO, 'Session timestamp: ' . $_SESSION['timestamp']);
doLog(INFO, 'Session elapsed time: ' . (time() -
$_SESSION['timestamp']));
doLog(INFO, 'Session max_lifetime: ' . $max_lifetime);
doLog(DEBUG, 'Session time out - call session_destroy()');
session_unset();
session_destroy();
return false;
}

$SESSION['timestamp']=3Dtime();
return true;

Re: VerständnisproblemCookies / Session Lifetime

am 24.08.2006 22:28:09 von Oliver Block

Thomas wrote:

> Hallo zusammen,
>
> ich habe ein Verständnisproblem mit folgender Aufgabenstellung:
>
> Eine Anwendung ist aus dem Intra- und Internet erreichbar. Aus dem
> Intranet soll die Session solange gültig bleiben, wie der Browser
> geöffnet ist.

Das geht nicht. Der Server weiß nicht, wann der Browser geschlossen wird. Du
kannst aber Deinen Benutzern nahelegen sich abzumelden.

> Aus dem Internet max. 5 Minuten, ausser der Benutzer
> setzt innerhalb dieser Zeit eine Request - dann sollen die 5 Minuten
> erneut anfangen.

Du könntest m.E. über JavaScript ein Timeout setzen und alle 3 Minuten etwas
anfordern.

> Bei Zugriffen aus dem Internet hat der Cookie eine Lebensdauer von 5
> Minuten - leider wird diese nicht aktualisiert, wenn nach z.B. 4
> Minuten eine neuer Request zu der Session kommt. Der Benutzer muss sich
> stets nach 5 Minuten neu anmelden.

Soweit ich weiß, wir die Session Dauer per Server eingestellt, und nicht im
Cookie. M.a.w. Nicht der Cookie entscheidet, ob der Benutzer neu anmelden
muß, sondern der Server.

Die Cookie-Lebensdauer entscheidet darüber, ob der Server einen neuen Cookie
setzt, oder nicht.

Konkret: Du kannst zwar über die Cookie-Lebensdauer die Session verkürzen,
du kannst Sie aber nicht verlängern.

Siehe z.B. session_destroy(); Die Session wird in erster Linie zum Speichern
von Werten auf der Serverseite benutzt, während im Cookie m.E. lediglich
die session ID gespeichert wird. Wenn die Session beendet ist, dann kann es
durchaus vorkommen, daß der Cookie noch gültig ist. Trotzdem muß sich der
Benutzer (in Deinem Fall) wieder anmelden.

Gruß,

Oliver



--
Leben ist mehr als schneller - weiter - höher

Re: Verständnisproblem Cookies / Session Lifetime

am 25.08.2006 11:31:24 von Helmut Chang

Oliver Block schrieb:

>> Eine Anwendung ist aus dem Intra- und Internet erreichbar. Aus dem
>> Intranet soll die Session solange gültig bleiben, wie der Browser
>> geöffnet ist.
>
> Das geht nicht. Der Server weiß nicht, wann der Browser geschlossen wird.

Natürlich geht das praktisch, wenn man Cookies für die Session
verwendet. Der Browser löscht das Session-Cookie beim Schließen per
default. Somit ist zwar die Session-Datei wahrscheinlich auf dem Server
noch einige Zeit vorhanden, in der Praxis ist die Session aber nicht
mehr gültig.

gruß, heli

Re: Verständnisproblem Cookies / Session Lifetime

am 25.08.2006 11:44:41 von Helmut Chang

Thomas schrieb:
> Hallo zusammen,
>
> ich habe ein Verständnisproblem mit folgender Aufgabenstellung:
>
> Eine Anwendung ist aus dem Intra- und Internet erreichbar. Aus dem
> Intranet soll die Session solange gültig bleiben, wie der Browser
> geöffnet ist. Aus dem Internet max. 5 Minuten, ausser der Benutzer
> setzt innerhalb dieser Zeit eine Request - dann sollen die 5 Minuten
> erneut anfangen.

Eventuell mit zwei VHosts für die Anwendung mit unterschiedlichen
Domains, mit denen auf die Anwendung zugegriffen wird und
unterschiedlichen Werten für session.gc_maxlifetime. Ich habe jetzt auf
die Schnelle im Manual
nichts gefunden, das exakt spezifiziert, ob dieser Wert die Anzahl der
Sekunden darstellt, nach denen der Session Garbage Collector eventuell
die Sesion-Datei löscht oder ob nach dieser Zeit die Session auf jeden
Fall ungültig ist. Eventuell muss man sich halt auch mit den anderen
session.gc_* Parametern beschäftigen.

Beispiel, wenn der Apache auf zwei IPs lauscht:

#
# Intranet
#
:80>
ServerName app.intranet
DocumentRoot "/pfad/zur/app"
...
php_value session.gc_maxlifetime ? #passender Wert


#
# Internet
#
:80>
ServerName app.example.com
DocumentRoot "/pfad/zur/app"
...
php_value session.gc_maxlifetime 300


gruss, heli

Re: VerständnisproblemCookies / Session Lifetime

am 26.08.2006 21:51:11 von Oliver Block

Helmut Chang wrote:

>> Das geht nicht. Der Server weiß nicht, wann der Browser geschlossen wird.
>
> Natürlich geht das praktisch, wenn man Cookies für die Session
> verwendet. Der Browser löscht das Session-Cookie beim Schließen per
> default. Somit ist zwar die Session-Datei wahrscheinlich auf dem Server
> noch einige Zeit vorhanden, in der Praxis ist die Session aber nicht
> mehr gültig.

Also weiß der Server nicht, daß der Browser geschlossen ist. So ist das bei
verbindungslosen Protokollen wie HTTP.

Ansonsten stimme ich Dir zu.

Gruß,

Oliver



--
Leben ist mehr als schneller - weiter - höher

Re: Verständnisproblem Cookies / Session Lifetime

am 28.08.2006 12:16:22 von Helmut Chang

Oliver Block schrieb:

> Also weiß der Server nicht, daß der Browser geschlossen ist.

Das habe ich ja auch nicht behauptet, bzw. angenommen.

gruss, heli

Re: Verständnisproblem Cookies / Session Lifetime

am 30.08.2006 20:39:18 von thomas

Helmut Chang schrieb:

> Oliver Block schrieb:
>
> > Also weiß der Server nicht, daß der Browser geschlossen ist.
>
> Das habe ich ja auch nicht behauptet, bzw. angenommen.
>
> gruss, heli

Hallo,

nochmals vielen Dank für die Hinweise. Sorry, wenn ich mich nicht ganz
korrekt ausgedrückt habe. Es ging mir ja ursprünglich um die
Lebenszeit des Cookies im Browser und die Möglichkeit diese durch
erneutes senden des Cookie zu aktualisieren.

Mit der Variante, in der Session den timestamp des letzten Request zu
speichern und darüber bei nächsten Request die verstrichenen Zeit zu
ermitteln (und bei Überschreitung die Abmeldung per session_destroy
durchzuführen) funktioniert bestens.

Danke und Grüße
Thomas