[PHP] session wordt niet verwijderd

Pagina: 1
Acties:
  • 155 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
Ik heb een heel vaag probleem bij een inlogsysteem.
Ik werk nu met sessies, deze moeten worden verwijderd wanneer de browser sluit. Dit gebeurt echter niet, de sessie file blijft gewoon staan in de sessiondata map.
ik heb in de ini de lifetime op 0 staan en dit nog eens extra benadrukt met session_set_cookie_params(0);
Heb ook al wat php.ini settings veranderd, zonder resultaat.

session_destroy() werkt uiteraard wel, maar het gaat puur om het sluiten van de browser.

Wie kan me helpen?

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
:) Zodra jij je browser sluit, dan weet PHP nog niet dat jij er niet meer bent. Het HTTP protocol is namelijk stateless. Het weet alleen dat jij er nog bent als jij een pagina aanvraagt.

PHP houdt dus die data in de sessie map (op de server) totdat jij een x aantal minuten geen pagina (die een session_start() doet) gebruikt. Deze tijd kun je instellen met Session_lifetime zoals je meen ik gedaan hebt :) Realiseer je echter wel dat 0 waarschijnlijk betekendt dat PHP hem nooit zal weggooien.

Als ik jou was zou ik hem lekker op een minuut of 10/15 zetten. Als je dan je browser sluit en deze zijn cookie met het id weggooit, zal php de sessie na 10/15 minuten weghalen. Controleer dat maar eens.

Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
Ik heb het geprobeerd , de lifetime van de sessie op een aantal minuten gezet (en apache opnieuw gestart natuurlijk :) , maar nog steeds hetzelfde probleem! De sessie blijft staan.
Wat ik ook gek vind is dat als php een sessie aanmaakt, het steeds dezelfde naam krijgt (in dit geval: sess_2314291ece7e39f383f613b487579087). Ik dacht juist dat php een willekeurige serial hiervoor maakte. Ik heb al eens eerder met sessie gewerkt op, toen kreeg ik steeds andere sessie codes.

Acties:
  • 0 Henk 'm!

Verwijderd

Zou je misschien een stukje code kunnen posten? Waarschijnlijk ligt het niet daaraan, maar aan de instellingen van je php.

Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
Code begint met:
PHP:
1
2
3
4
// start van de sessie
session_start();
session_register("sesGebruikersnaam");
session_register("sesWachtwoord");


Na het checken van ingevoerde gegevens:
PHP:
1
2
3
// ingevulde gegevens zijn goed
$_SESSION['sesGebruikersnaam'] = $row['gebruikersnaam'];
$_SESSION['sesWachtwoord'] = md5($wachtwoord);


Gelijk daarna wordt je doorverwezen naar een pagina die dezelfde session start heeft als eerste stukje code.

Vervolgens komt een stukje script wat checkt of de sessie bestaat. (voor nu ff in eenvoudige vorm :P ).
PHP:
1
2
3
4
// ff een simpele sessie check...
if(empty($_SESSION['sesWachtwoord'])) {
    header("location:login.php");   
}

Acties:
  • 0 Henk 'm!

Verwijderd

Dmv javascript(body onLoad) een popup naar logout.php maken, waarin je de sessie wegpleurt (destroy of unregister). Dan met javascript popup weer sluiten (window.close)
niet getest...maar zou moeten werken.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb hetzelfde probleem op dit moment als zmartino, en heb van alles en nog wat geprobeerd in de configuratie. Het bestand blijft bestaan en elke keer wordt inderdaad hetzelfde bestand aangemaakt, terwijl je zou denken dat het steeds een nieuwe moet maken.

PHP moet toch in staat zijn om na een x aantal minuten het sessie bestand te verwijderen?

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Je gebruikt nu session_register en $_SESSION[] door elkaar... Lees eens wat daarover staat in de PHP-manual?
Caution
If you are using $_SESSION (or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered() and session_unregister().
je kunt gewoon

$_SESSION['var'] = "bla";

gebruiken :)

Acties:
  • 0 Henk 'm!

Verwijderd

welke php versie gebruik je?

Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
Ok Bosmonster, maar dat staat los van de sessie file op zich lijkt me :? . Deze moet gewoon door php vernietigd worden.

Uit manual :O :
If you are using $HTTP_SESSION_VARS/$_SESSION and disable register_globals, do not use session_register(), session_is_registered() and session_unregister().
dikgedrukte is niet het geval bij mij, globals staat aan, anders wordt het te lastig de sessie variabelen in functies te krijgen.
Daarbij komt dat ik wel session_register moet gebruiken, anders doet de login het helemaal niet meer.

Versie van php: 4.2.3

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

anders wordt het te lastig de sessie variabelen in functies te krijgen.
Verklaar je nader. Ik zou niet weten waarom dat lastig zou zijn. De nieuwe manier van werken met sessies vind ik juist een stuk overzichtelijker.

Systeem | Strava


Acties:
  • 0 Henk 'm!

Verwijderd

Ik gebruik PHP versie 4.2.3, heb de volgende php.ini vwb sessions:

session.save_handler = files
session.save_path = c:\phpdev\session
session.use_cookies = 0
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path =
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_maxlifetime = 1440
session.referer_check =
;session.entropy_length = 0
session.entropy_file =
;session.entropy_length = 16
session.cache_limiter = nocache
session.cache_expire = 1
session.use_trans_sid = 0
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"

en gebruik in het eerste PHP bestand de volgende code:
PHP:
1
2
session_start();
$_SESSION["bla"] = "blabla";


en in een volgend bestand:
PHP:
1
2
session_start();
echo $_SESSION["bla"];


Nou, hartstikke leuk, dat doet het allemaal. Maar het bestand blijft in c:\phpdev\sessions bestaan, na 1 minuut na afsluiten van browser (inmiddels 20 minuten :r ), en de sessionid blijft steeds hetzelfde voor dezelfde browser.

Genereert PHP (want die wordt gebruikt voor het maken van een session ID) soms steeds op basis van vaste waarden (user_agent, ip adres, etc..) een session id?

Gegroet!

Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
In reactie op brakkie:

Op de een of andere vage wijze, kan ik niet "gewoon" sessie variabelen benaderen met $_SESSION['var']. wanneer ik niet eerst session_register("var") doe, kan ik $_SESSION niet uitlezen. Dat is ontzettend vaag, aangezien $_SESSION deze aanroep(session_start, session_register) overbodig zou moeten maken.

Wat betreft talk2me: dat is precies wat er bij mij ook gebeurt!

Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 12:54

Bosmonster

*zucht*

Wat is nu precies het probleem?

Als je je browser vensters afsluit en je start een nieuwe clientside sessie en je gaat naar de site dan zit je weer in de oude sessie?

Want ik zou me niet te druk maken over welke ID's gebruikt worden of wanneer je webserver de cookies opschoont.. Dit staat voor zover ik weet namelijk los van de levensduur van de cookie..

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Register Globals staat dus op on bij jou zoals ik het nu begrijp? Als dat het geval is kan je helemaal niet de Global $_SESSION gebruiken. Maar moet je alleen met session_register() werken.

Zet dus Register Globals op off. (gevolg is wel dat je overal in je code met $_POST, $_GET..... enz moet werken. Op deze manier werkt het bij mij prima namelijk.

Ook met versie 4.2.3

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
php.ini quote:
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime=0
In php.ini staat de levensduur van de sessie cookie als instelling. Heeft dus niets met je webserver te maken toch?!
Nogmaals het belangrijkste probleem: ik sluit de browser, de sessie wordt niet verwijderd. Ik start de browser opnieuw, ik kan gewoon verder met de oude sessie. Lekker veilig! |:(

Acties:
  • 0 Henk 'm!

Verwijderd

check de bug report:

http://bugs.php.net/bug.php?id=3793

Maar of het nou hier mee te maken heeft?

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Verwijderd schreef op 15 November 2002 @ 16:23:
check de bug report:

http://bugs.php.net/bug.php?id=3793

Maar of het nou hier mee te maken heeft?
Check het versie nummer van PHP bij die bug :Z

Kijk eens ff naar mijn laatste post. Wie weet maakt de manier waarop je met sessies werkt wel uit voor het probleem dat je hebt. Zoals ik je namelijk nu begrijp gebruik je twee manier door elkaar. En met session_register() EN met $_SESSION. Het gebruik van $_SESSION is dus niet mogelijk als je register globals op on hebt staan.

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
niet in de bug sfeer duiken plz. ;(

Acties:
  • 0 Henk 'm!

Verwijderd

brakkie schreef op 15 November 2002 @ 16:25:
[...]


Check het versie nummer van PHP bij die bug
Helemaal onderin de bug:
BTW I use win2000+iis5+php4.2.2.

Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
Ik zal het eens proberen met globals off. Thanx anyway!

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

zemartino schreef op 15 november 2002 @ 16:29:
Ik zal het eens proberen met globals off. Thanx anyway!
En dan wel alleen $_SESSION gebruiken en de session_register shit achterwege laten.

Zo pak ik het dan aan in dezelfde config als jij. En bovenaan de pagina dan session_start();

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
function login($user_name, $password)
{


$query =    "SELECT 
                medewerkers_id, 
                aanmeldnaam, 
                groep_id 
            FROM 
                intr_gebruikers 
            WHERE 
                aanmeldnaam = '$user_name' 
            AND paswoord = '$password'
            ";  

$result = mysql_query($query);

$usergegevens = mysql_fetch_array($result);
$aantal = mysql_num_rows($result);


if($aantal < 1)
        {
        $inlogstring = "De combinatie van gebruikersnaam en paswoord komt niet voor in de gebruikersdatabase";
        return $inlogstring;
        }
else
        {

        $_SESSION['medewerkers_id'] = $usergegevens[0];
        $_SESSION['aanmeldnaam'] = $usergegevens[1];
        $_SESSION['groep_id'] = $usergegevens[2];

        }



}
Helemaal onderin de bug:


quote:
--------------------------------------------------------------------------------

BTW I use win2000+iis5+php4.2.2.
Hij gebruikt apache + php 4.2.3

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Verwijderd schreef op 15 november 2002 @ 16:09:
Ik gebruik PHP versie 4.2.3, heb de volgende php.ini vwb sessions:

session.cookie_lifetime = 0
session.cookie_path =
session.cookie_domain =
session.serialize_handler = php
session.gc_probability = 1
session.gc_maxlifetime = 1440
session.cache_expire = 1
Speel eens met de gc_probability (hoe hoger hoe vaker de GC langs komt) en gc_maxlifetime

Wat voor een filesystem gebruik je? Aangezien FAT filesytemen problemen geven met de GC.
If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other fs where atime tracking is not available.
<Niet interresant>

Nou, hartstikke leuk, dat doet het allemaal. Maar het bestand blijft in c:\phpdev\sessions bestaan, na 1 minuut na afsluiten van browser (inmiddels 20 minuten :r ), en de sessionid blijft steeds hetzelfde voor dezelfde browser.

Genereert PHP (want die wordt gebruikt voor het maken van een session ID) soms steeds op basis van vaste waarden (user_agent, ip adres, etc..) een session id?
PHP maakt gebruik van vaste waarden en random waardes om een Sessie ID te generenen.

Heb je wel alle browser windows afgesloten? Aangezien sessie cookies dan pas worden verwijders uit het geheugen...


Je kan natuulijk ook geen sessie cookie's gebruiken.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

Verwijderd

Thanks voor de tips. Was er ook al mee bezig na het hierbovenstaande gelezen te hebben.
Ik had eerst de indruk dat session.cache_expire de setting was voor het verwijderen van de session bestanden.

En ja inderdaad, ik ontwikkel hier op een FAT (win98), gelukkig op Linux in productie, waarvan ik begrijp dat het probleem daar niet bestaat.

Acties:
  • 0 Henk 'm!

  • sjon.
  • Registratie: November 2002
  • Laatst online: 14-01-2024
wat ook handig is om te weten, is dat als je op een eigen servertje werkt, de gc, als ie al kan werken (FAT vs NTFS), een keer per zoveel requests word uitgevoerd. en aangezien jij de enigste bent die requests maakt, dat wel even kan duren... ik heb zelf meestal een stuk of 100 sessie bestandjes in me tmp dir staan, simpelweg omdat de gc niet zo vaak word uitgevoerd...

en als je de ini instellingen goed hebt, wat ik vanuit bovenstaande van talk2me zo'n beetje opmaak, moet je er dus wel voor zorgen dat je browser ook idd HELEMAAL uit 't geheugen is verwijderd.

Acties:
  • 0 Henk 'm!

  • zemartino
  • Registratie: Augustus 2002
  • Niet online
Ik leg me erbij neer. Het zal wel iets met de garbage collection te maken hebben. Nog steeds vreemd dat met register globals OFF ik niet de super globals zoals $_SESSION kan gebruiken... :(
Pagina: 1