[PHP] Login wordt niet onthouden -> Sessie wordt niet hervat

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
edit: opgelost. Voortaan session_id voor session_start() :+ (bedankt, gvdh :) )

Hoi,

Ik zit hier met een vreemd probleem met een log-in systeem wat ik aan het maken ben. Het systeem werkt als volgt:
  1. Gebruiker logt in
  2. session_id() wordt in database gestopt, met user-id van de gebruiker. (En nog wat andere details, zoals IP)
  3. session_id() wordt in cookie gestopt.
  4. Er wordt gecontroleerd of de sessie geldig is. (Of het IP, user agent overeenkomt etc)
  5. Uit de database worden de gegevens van de user gehaald, en deze worden opgeslagen in een registry classe.
Als ik inlog, werkt het systeem goed. Het enige wat niet goed werkt is als je de browser afsluit, en weer naar de site toegaat. Je bent uitgelogd - wat wel vreemd is. De cookie waarin het sessie id staat, bestaat nog. De gebruikersgegevens worden niet uit de database opgehaald. Toch komt het sessie id van de cookie overeen met de database sessie_id().

Ook kun je dan niet meer opnieuw inloggen, totdat je de cookies verwijderd hebt.

Het volgende stukje code is verantwoordelijk voor het ophalen van de userdata als de pagina geladen wordt:

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
39
40
41
private function __get_user()
    {
        if ( isset ( $_GET['do'] ) and $_GET['do'] == 'logout' )
        {
            $this->kill_session();
        }           
        
        if ( isset ( $_COOKIE['logged_in'] ) )
        {
            session_id ( $_COOKIE['logged_in'] );
        }
        if ( isset ( $_SESSION['logged_in'] ) and $_SESSION['logged_in'] )
        {
            $query = $this->db->query ( "SELECT uid, ua, ip, ttl FROM session_handler WHERE sid='" . session_id() . "' LIMIT 1");
            
            if ( $this->db->count ( $query ) != 1 )
            {
                $this->kill_session();
            }
            else
            {
                $s = $this->db->fetch_array ( $query );
                
                if (    $_SERVER['HTTP_USER_AGENT'] != $s['ua'] or
                        time()                      > $s['ttl'] or
                        $_SERVER['REMOTE_ADDR']     != $s['ip'] and
                        $_SESSION['IP_CHECK']   )
                {
                    $this->kill_session();
                }
                else
                {               
                    registry::init()->set('usrdata', $this->db->FetchQuery ( "SELECT id, name, g_id FROM users WHERE id='" . $s['uid'] . "' LIMIT 1" ) );
                }
            }
        }
        else
        {
            registry::init()->set('usrdata', array ('id' => 0, 'g_id' => 0, 'name' => 'Gast', ) );
        }
    }


En dit stukje code logt de gebruiker in.

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
public function auth_user ( $username, $password )
        {
            $query = $this->db->query ( "SELECT * FROM users WHERE name='" . mysql_real_escape_string( $username ) . "' AND password='" . $this->salt ( $password ) . "'" );
            
            if ( $this->db->count ( $query ) != 1 )
            {
                return false;
            }
            else
            {
                $userdata = $this->db->fetch_array($query);
                
                registry::init()->set('usrdata', $userdata, true ); #registry value overschrijven
                
                $this->db->query ( "INSERT INTO session_handler
                                    (uid, sid, ua, ip, ttl)
                                    VALUES
                                    ('" . $userdata['id'] . "', '" . session_id(). "', '" . mysql_real_escape_string ( $_SERVER['HTTP_USER_AGENT'] ) . "', '" . mysql_real_escape_string ( $_SERVER['REMOTE_ADDR'] ) . "', '" . ( time() + $this->settings['session_lifetime'] ) . "')" );
                
                
                $_SESSION['logged_in'] = true;
                setcookie ( 'logged_in', session_id() , time() + 3600 * 48 );
                
                return true;
            }
        }


FetchQuery(); is trouwens een combinatie van mysql_query(); en mysql_fetch_array();
Het ligt niet aan een vreemde configuratie van de server, want andere login scripts werken wel. Ook is de server gewoon localhost. :)

Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Wat jij verder ook met je cookie uitspookt, de sessie wordt volgens mij beëindigd als je de browser afsluit. Dus die $_SESSION variabelen zijn waarschijnlijk leeg. Even debuggen?

edit: ah, die session variabele wordt zeker gevuld door die session_id functie. Waar roep je session_start aan?

[ Voor 31% gewijzigd door Bozozo op 21-03-2010 11:02 ]

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
session_start() wordt bovenaan in het script aangeroepen wat het hierboven geplaatste script aanroept. (ben ik vergeten te zeggen :+)

Eerst stond session_start in de functie __get_user(), maar dat werkte ook niet.

Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Laatst online: 23:00
Je kan best && i.p.v. 'and' en || i.p.v. 'or' gebruiken. Zie http://www.php.net/manual....operators.precedence.php

Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
Ik vind zelf 'and' en 'or' leesbaarder :p. Voor de rest zal het niet uitmaken denk ik.

Acties:
  • 0 Henk 'm!

  • gvdh
  • Registratie: December 2009
  • Laatst online: 23:00
X_lawl_X schreef op zondag 21 maart 2010 @ 11:09:
[...]

Ik vind zelf 'and' en 'or' leesbaarder :p. Voor de rest zal het niet uitmaken denk ik.
In dit geval niet, maar er zijn gevallen waar het wel uitmaakt. "and" en "or" hebben de allerlaagste precedence.
If id is specified, it will replace the current session id. session_id() needs to be called before session_start() for that purpose. Depending on the session handler, not all characters are allowed within the session id. For example, the file session handler only allows characters in the range a-z A-Z 0-9 , (comma) and - (minus)!
Wordt session_id vóór session_start aangeroepen?

Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 11-09 16:13
Dat was het probleem dus. Ongelofelijk dat je voor zo iets kleins dagen aan het zoeken bent >.<

Bedankt!

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

PHP:
1
        if ( isset ( $_SESSION['logged_in'] ) and $_SESSION['logged_in'] )

Hier komt 'ie natuurlijk nooit doorheen in __get_user bij een nieuwe sessie. Ja wel als je daarna pas session_start aanroept, want dan worden die sessievariabelen weer gevuld :P

[ Voor 22% gewijzigd door CodeCaster op 21-03-2010 11:28 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

CodeCaster schreef op zondag 21 maart 2010 @ 11:27:
PHP:
1
        if ( isset ( $_SESSION['logged_in'] ) and $_SESSION['logged_in'] )

Hier komt 'ie natuurlijk nooit doorheen in __get_user bij een nieuwe sessie. Ja wel als je daarna pas session_start aanroept, want dan worden die sessievariabelen weer gevuld :P
Lijkt er op dat dat ook niet is voor een nieuwe sessie, maar voor als er al ingelogd is. :9

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Verwijderd schreef op zondag 21 maart 2010 @ 16:52:
[...]

Lijkt er op dat dat ook niet is voor een nieuwe sessie, maar voor als er al ingelogd is. :9
Het sessie-systeem van php en inlogsysteem van TS staan natuurlijk helemaal los van elkaar. Op het moment dat jij na een browser-herstart de pagina opnieuw bezoekt en er wordt éérst een sessie gestart en daarna pas een oud sessie-id gepakt uit het inlogsysteem, dan kun je er niet van uit gaan dat de sessievariabelen uit de oude sessie weer bestaan. Daarvoor moet dus het sessie-id worden geset vóór de sessie wordt gestart.

[ Voor 35% gewijzigd door CodeCaster op 21-03-2010 18:52 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Ah I see, je hebt gelijk. :Y
Pagina: 1