[PHP/Cookies] Cookie werkt in IE pas na refresh

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Ik heb een vreemd probleem, tenminste dat vind ik zelf. Ik heb een simpel login systeem gemaakt, waarbij je ervoor kunt kiezen om je gegevens te onthouden. Als je dat doet dan worden je userid en encrypted wachtwoord opgeslagen in een cookie. Roep je dan opnieuw de pagina login.php aan en deze ziet dat er al een cookie is, moet hij je doorsturen naar eigenaren.php.

Om bovenstaande te verduidelijken een een schema:

--> Gebruiker opened login.php, voert gegevens in en vinkt "Gegevens onthouden" aan
--> Login.php controleert de gegevens:
--------> correct: stel cookie in, stel sessie gegevens in, stuur door naar eigenaren.php
--------> incorrect: stuur terug naar login.php met foutmelding

We gaan er nu vanuit dat het goed is gegaan en gebruiker is ingelogged, de cookie en sessie gegevens zijn ingesteld.

--> Gebruiker opend login.php, gegevens staan in cookie en login.php controleert deze.
--------> correct: stuur door naar eigenaren.php (en update e.v. sessie / cookie gegevens)
--------> incorrect: stuur terug naar login.php (dit kan alleen als een gebruiker in de tussen tijd verwijderd zou zijn en dus de gegevens in het cookie niet meer geldig zijn)

Zo zou het moeten gaan en FF doet dat ook, echter zodra ik, nadat ik via IE heb ingelogged en dan in de browser balk weer een aanroep doe naar login.php, toont hij gewoon het aanmeld formulier i.p.v. mij door te sturen naar eigenaren.php. Druk ik dan op F5, stuurt hij me wel door naar eigenaren.php.

Ik gebruik de volgende code:
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
if((!isset($_COOKIE['bbnpassword'])) || (!isset($_COOKIE['bbnuid'])))
{
    // Geen cookie dus aanmelding afhandelen, is formulier aangeroepen?
    if(!empty($_POST["submit"]))
    {
        // Het is aangeroepen, gegevens valideren
        // ...
        
        if(!$gebruiker_bestaat)
        {
            // Combinatie van loginnaam & wachtwoord is niet correct
            // Geef melding ...
        }
        else
        {
            // Combinatie van login & wachtwoord is correct, opslaan in sessie
            session_start();
            
            // Extra controle gegevens in sessie opslaan
            // ...
            
            // Is aangevinkt dat gegevens onthouden moeten worden?
            if($_POST["chckOnthouden"] == "on")
            {
                // Aangevinkt, dus stellen we een cookie in
                setcookie('bbncreated', time(), time()+31536000);
                setcookie('bbnpassword', $password, time()+31536000);
                
                // Userid opvragen en opslaan
                // ...
                setcookie('bbnuid', $result['id'], time()+31536000);
            }
            
            // Doorsturen naar eigenarenservice
            header("Location: eigenaren.php");
        }       
    }
    else
    {
        // inlog is niet aangeroepen, formulier tonen
        // ...
    }
}
else
{
    // Cookie bestaat, controleren of deze verlopen is
    if($_COOKIE["bbncreated"] > time())
    {
        // Cookie is verlopen, terug naar de inlog pagina en cookies verwijderen
        setcookie('bbncreated', '', time()-31536000);
        setcookie('bbnpassword', '', time()-31536000);
        setcookie('bbnuid', '', time()-31536000);                   
        header("Location: login.php");
    }
    else
    {
        // Cookie is nog niet verlopen, dus inloggen met die gegevens
        // validatie ...
        
        if(!$gebruiker_bestaat)
        {
            // De gegevens in het cookie zijn niet meer correct, dus cookie verwijderen
            // Er dient opnieuw ingelogged te worden
            setcookie('bbncreated', '', time()-31536000);
            setcookie('bbnpassword', '', time()-31536000);
            setcookie('bbnuid', '', time()-31536000);                   
            header("Location: login.php");
        }
        else
        {
            // Combinatie van login & wachtwoord is correct, opslaan in sessie
            session_start();
            
            // Extra controle gegevens in sessie opslaan
            // ...
            
            // Vernieuwe cookie tijd, voor volgende test op verloop
            setcookie('bbncreated', time(), time()+31536000);
                    
            // Doorsturen naar eigenarenservice
            header("Location: eigenaren.php");
        }
    }
}


Ik heb de validatie code gestript, die lijkt me niet zo van belang, aangezien dat allemaal correct werkt.

Iemand van jullie een idee wat ik hier fout doe?

[ Voor 6% gewijzigd door Crazybyte op 13-07-2006 16:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

De reden waarom de cookie het niet doet, is omdat deze pas wordt opgeslaten op de browser, als de pagina al geladen IS. Voordat de pagina niet geladen is, is er dus ook geen cookie op de browser gemaakt.

Ik loste dit altijd op, door een speciale inlog pagina te maken en dan meteen een soort round trip te maken door middel van:

PHP:
1
Header("location: pagina.php");


Zo werkte het in ieder geval bij mij

EDIT: HMm.. dat deed je al :+ Maar waarom dat niet werkt.... :o

[ Voor 10% gewijzigd door Verwijderd op 13-07-2006 19:55 ]


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Note: If you are using cookie-based sessions, you must call session_start() before anything is outputted to the browser.
Oftewel, session_start() even bovenaan je pagina zetten.

[ Voor 14% gewijzigd door CodeCaster op 13-07-2006 19:58 ]

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


Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
CodeCaster schreef op donderdag 13 juli 2006 @ 19:58:
[...]

Oftewel, session_start() even bovenaan je pagina zetten.
Dat gaat over de sessie, maar er is geen output naar de browser voor dat ik session_start() doe.

Het probleem zit hem in het cookie, hij slaat nadat je ingelogged hebt en aangevinkt hebt "Gegevens onthouden", het wachtwoord en een userid op in een cookie. Als iemand dan die pagina aan roept, terwijl hij "Gegevens onthouden" heeft gedaan, bestaat die cookie dus al, hij kijkt of die cookie er is en met die gegevens logged hij hem automatisch in.
Roep je echter die pagina dus voor de 2de keer aan in IE dan toont hij het login scherm, terwijl het cookie bestaat en hij hem automatisch moet inloggen en doorsturen. Druk je dan op F5 werkt het wel.