Session sluit niet

Overzicht Reageren

Direct weten hoe jij ervoor staat in de arbeidsmarkt?
Bas Engel

Bas Engel

16/08/2012 22:11:15
Quote Anchor link
Ik ben echt wat je noemt een startende phper en probeer nu een login scriptje te bouwen. Het lukt al aardig maar nu loop ik toch echt tegen een probleem waar ik zel niet uitkom en hoopte ik dat iemand mij wil vertellen wat ik fout doe.

Op het moment dat ik wil uitloggen en klik op de submit button die ik hier voor aangemaakt heb lijkt het of ik succesvol ben uitgelogd echter als ik de browser niet afsluit en naar de link ga van de beveiligde pagina opent die de pagina daarna gewoon.

Dit is de code voor die ik heb voor mijn <html> tag:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
session_start();
if (!isset($_SESSION["email"])){
    $tekst = "U bent nog niet ingelogd, <a href=\"../../index.php\">klik hier</a> om in te loggen";
    echo($tekst);
    exit();
}

if (isset($_POST['u'])){
session_unset(); // alle variabelen vrijgeven
session_destroy();} // sessie afsluiten
?>


Ik hoop dat iemand mij even in de juiste richting wil brengen.
 
PHP hulp

PHP hulp

20/06/2013 05:46:24
 
Jelle Seubring

Jelle Seubring

16/08/2012 22:17:56
Quote Anchor link
Weet niet of je ook cookie's gebruikt?

zo ja, probeer dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
session_destroy();  

        // cookies deleten
        if(isset($_COOKIE['gebruikersnaam'])) {
              setcookie("gebruikersnaam", "", time(), "/");
        }
        if(isset($_COOKIE['wachtwoord'])) {
              setcookie("gebruikersnaam", "", time(), "/");
        }
        if(isset($_COOKIE['voornaam'])) {
              setcookie("voornaam", "", time(), "/");
        }
        if(isset($_COOKIE['achternaam'])) {
              setcookie("achternaam", "", time(), "/");
        }


pas wel ff je cookie-data aan
 
- SanThe -

- SanThe -

16/08/2012 22:22:54
Quote Anchor link
Ik gooi de session altijd weg en maak direct een nieuwe met een nieuw id.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// begin van je script
session_start();


// bij uitloggen
session_destroy();
session_id(sha1(microtime()));
session_start();
?>
 
Bas Engel

Bas Engel

16/08/2012 22:48:27
Quote Anchor link
Thanks voor de snelle reacties.

Ik kom er alleen nog steeds niet helemaal uit, ik krijg nu de volgende melding als ik probeer in te loggen op mijn beveiligde pagina:

Parse error: syntax error, unexpected $end in /home/wp00216/domains/qepa.nl/public_html/admin/login/login_on/index.php on line 53

regel 53 op deze pagina is de </html> tag, hierbij de code zoals ik hem nu heb staan.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
session_start();
if (!isset($_SESSION["email"])){
    $tekst = "U bent nog niet ingelogd, <a href=\"../../index.php\">klik hier</a> om in te loggen";
    echo($tekst);
    exit();
}

if (isset($_POST['u'])){
session_destroy();  
session_id(sha1(microtime()));
session_start();
?>
 
Thomas de vries

thomas de vries

16/08/2012 22:52:51
Quote Anchor link
unexpected $end betekend dat je een }(Accolade) teken mist.
 
- SanThe -

- SanThe -

16/08/2012 22:55:12
Quote Anchor link
Je sluit if() niet af. Je hebt een { maar geen } achter de if().
 
Bas Engel

Bas Engel

16/08/2012 23:09:53
Quote Anchor link
De foutmelding is nu weg, die had ik over het hoofd gezien. Maar ik blijf het probleem houden dat als ik uitgelogd ben en weer naar de url van de beveiligde pagina ga ik die gewoon kan benaderen. Dit is zoals de code er nu uitziet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
session_start();
if (!isset($_SESSION["email"])){
    $tekst = "U bent nog niet ingelogd, <a href=\"../../index.php\">klik hier</a> om in te loggen";
    echo($tekst);
    exit();
}

if (isset($_POST['u'])){
session_destroy();  
session_id(sha1(microtime()));
session_start();
}

?>
 
- SanThe -

- SanThe -

16/08/2012 23:29:55
Quote Anchor link
Bas Engel op 16/08/2012 23:09:53:
.. dat als ik uitgelogd ben en weer naar de url van de beveiligde pagina ga ..


En hoe check jij daar of je toegang hebt?
 
Bas Engel

Bas Engel

16/08/2012 23:32:43
Quote Anchor link
Door de link te kopieren als ik ingelogd ben en in de adresbalk plak als ik ben uitgelogd.
 
- SanThe -

- SanThe -

16/08/2012 23:41:26
Quote Anchor link
Ik bedoel in het bestandje.
 
Bas Engel

Bas Engel

16/08/2012 23:48:49
Quote Anchor link
Door:

if (!isset($_SESSION["email"]))

Of bedoel je iets anders?
 
- SanThe -

- SanThe -

16/08/2012 23:50:02
Quote Anchor link
if (!isset($_SESSION["email"])) .... en dan mag je verder?
 
Bas Engel

Bas Engel

17/08/2012 00:19:36
Quote Anchor link
Is dat niet goed dan?
 
Aaron -

Aaron -

17/08/2012 00:23:25
Quote Anchor link
!isset betekent eigenlijk zoveel als, als waarde niet bestaat... dan. Dus ik denk dat je moet kijken of $_SESSION['email'] werkelijk bestaat.

Verder zou ik ook geen link aan de gebruiker tonen, maar de gebruiker gewoon naar de inlog pagina sturen (persoonlijke keuze).

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php session_start();

if(isset($_SESSION['email'])) {
    echo 'Ingelogd.';
}


else {

    /**
     * Stuur hier de gebruiker naar de inlog pagina:
     */

    header('Location: http://example.nl/');
    exit();
    
}


?>


Tevens zou ik twee sessies aanmaken:
1. $_SESSION['user']['id'] -> ID van de gebruiker,
2. $_SESSION['user']['session'] -> persoonlijke sessie van de gebruiker

Op iedere pagina kijk je dan of die sessie nog in de database staat en natuurlijk match met $_SESSION['user']['id']. Op de inlog pagina moet je $_SESSION['user']['session'] ook in de database opslaan samen met $_SESSION['user']['id'].

Daarnaast zou ik kijken of de gebruiker niet te lang inactief is. Daarmee bedoel ik als een gebruiker in 15 à 30 minuten geen enkele pagina heeft herladen, dat hij/zij naar de inlog pagina wordt doorverwezen.
Gewijzigd op 17/08/2012 04:01:19 door Aaron -
 
Chris NVT
Redacteur

Chris NVT

17/08/2012 07:41:57
Quote Anchor link
Hoe ik meestal test of de sessie ook echt beeindigd is is zo.

Op het login scherm print_r($_SESSION); zetten. Als je succesvol bent uitgelogd zal het een lege array geven. Ben je nog wel ingelogd zal er in jou geval email => test@test.nl staan. Waar uiteraard test@test.nl jou email is.

Ik redirect mensen altijd weer naar het inlogscherm zodra er uitgelogd wordt, meestal zijn mijn login systemen voor ons eigen CMS. Maar als het gewoon een login is, zet je print_r($_SESSION); gewoon op de pagina waar je heen gaat als mensen uitloggen.
 
Obelix en Idefix

Obelix en Idefix

17/08/2012 07:55:57
Quote Anchor link
Als de controle met !isset plaats vindt zoals in je code in je openingspost is het op zich goed. Als niet bestaat, dan melding.

Maar hoe controleer je op de beveiligde pagina?

Ten aanzien van je code nog wat opmerkingen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php    $tekst = "U bent nog niet ingelogd, <a href=\"../../index.php\">klik hier</a> om in te loggen";
    echo($tekst);
    exit();
?>

Zou ik korter schrijven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
    $tekst
= 'U bent nog niet ingelogd, <a href="../../index.php">klik hier</a> om in te loggen;
    echo $tekst;
    exit();
?>

Let ook op ' (in php zoals bv echo) ipv " (voor HTML).
Of, nog korter, gewoon:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
echo 'U bent nog niet ingelogd, <a href="../../index.php">klik hier</a> om in te loggen;
exit();
?>

Waarom de exit eigenlijk? Je beeindigt daarmee het hele script (dus ook de verdere opmaak/layout). Hierdoor missen, volgens mij zaken als </body></html> (en mogelijk nog wat </div>'s).
Gewijzigd op 17/08/2012 07:58:15 door Obelix en Idefix
 
Chris NVT
Redacteur

Chris NVT

17/08/2012 08:13:58
Quote Anchor link
Obelix,

Zijn originele !isset lijkt mij niet goed. Hij krijgt netjes een melding wanneer er niet is ingelogd, maar wat nu als er wel succesvol is ingelogd? Lijkt me dat hier nog een else moet zijn die hem of doorverwijst naar de juiste pagina, of de pagina laat zien.
 
Erwin H

Erwin H

17/08/2012 08:57:20
Quote Anchor link
Volgens mij moet je eerst een onderscheid maken tussen sessie en het ingelogd zijn van de gebruiker. Dat is namelijk niet hetzelfde. Je kan namelijk prima een sessie per gebruiker hebben, zonder dat de gebruiker ingelogd is.

Ik heb gebruikers gegevens in de sessie staan die bepalen of een gebruiker ingelogd is of niet. Zo staat er bijvoorbeeld zijn user_id in en misschien ook nog wel zijn username of andere settings. Op het moment dat een pagina wordt opgeroepen wordt er gekeken of de gebruiker is ingelogd, namelijk door te controleren of er een user_id is gegeven in de sessie. Zo nee, dan is de gebruiker niet ingelogd (de sessie bestaat dus wel!).

Enige wat je dan hoeft te doen met het uitloggen is de gegevens uit de sessie halen die bepalen of de gebruiker is ingelogd. In bovestaande geval dus user_id. Een log out script zou dus in feite zo simpel kunnen zijn als:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
unset( $_SESSION['user_id'] );
?>


De volgende keer dat een pagina wordt opgeroepen bestaat de user_id niet en dus is er geen gebruiker ingelogd.
 



Overzicht Reageren