[php]Sessie wil niet afgesloten worden.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • marapuru
  • Registratie: September 2004
  • Laatst online: 29-07 12:52
Op dit moment ben ik bezig met een login script dat het inloggen en uitloggen afhandelt.
Het inloggen gaat perfect, de gebruikersnaam en wachtwoord worden ingevoerd en als er op login word geklikt dan worden deze gegevens in de sessie geplaatst waardoor de gebruiker altijd netjes blijft ingelogd totdat de browser word afgesloten.

Echter als er op de logout knop word geklikt om de sessie te beeindigen gebeurt er niets, de pagina refreshed (er wordt dus wel gepost!) maar de sessie blijft bestaan.

De code die ik heb is als volgt:
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
// Logout knop instellen in de var $logout_button
$logout_button = '<form method="post"><table border="0" cellspacing="0" cellpadding="0"><tr><td>
                  <input accesskey="l" id="submit_logout" name="submit_logout" type="submit" value="Log uit" />
                  </td></tr></table></form>';

// Controleren of de Sessie variabele al is aangemaakt!
if (isset($_SESSION['username'])) {
    // De username en de logout knop weergeven.
    $login_msg = "Welkom " . $_SESSION['username'] . " (" . $_SESSION['userlevel'] . ")" . $logout_button;

// De user wil uitloggen (heeft op logout geklikt).
} elseif ($_SERVER["REQUEST_METHOD"] == "POST" AND isset($_POST['submit_logout'])) {

    // Sessie weghalen
    session_unset();
    // Custom message aanmaken die bij de login wordt weergegeven
    $login_msg = "U bent uitgelogd.<br><a href=index.php>Log in</a>";
        
// Als de submit_login knop is ingedrukt wordt dit uitgevoerd
} elseif ($_SERVER["REQUEST_METHOD"] == "POST" AND isset($_POST["submit_login"])) {

    // Query opstellen voor het vergelijken van de username/password
    $login_query = mysql_query("SELECT * FROM gebruikers WHERE username = '".$_POST['username']."' AND password = '".$_POST['password']."'");
    // Query uitvoeren, als controle op de username en password
    $login_check = mysql_num_rows($login_query);
    
    // Nakijken of er minimaal 1 rij tevoorschijn is gekomen.
    if ($login_check == 1) {
        
        // De resultaten ophalen en in array plaatsen
        $login_results = mysql_fetch_assoc($login_query);
        
        // De username en userlevel in de sessie plaatsen
        $_SESSION['username'] = $login_results['username'];
        $_SESSION['userlevel'] = $login_results['userlevel'];
        // De login message instellen als de gegevens kloppen en de gebruiker dus is ingelogd.
        $login_msg = "Welkom " . $_SESSION['username'] . " (" . $_SESSION['userlevel'] . ")" . $logout_button;
        
    } else {
        // Foutmelding bij verkeerd ingevoerde gegevens
        $login_msg = 'De inloggegevens zijn niet juist, probeer het opnieuw.';
    }

} else {
    // De Login message instellen op het weergeven van het formulier
    $login_msg = '<form method="post"><table border="0" cellpadding="0" cellspacing="2"><tr><td>Naam / Wachtwoord</td>
                  </tr><td><input accesskey="g" id="username" onFocus="deltext(this)" name="username" type="text" size="10" value="Naam" /></td>
                  <tr><td><input accesskey="p" id="password" onFocus="deltext(this)" name="password" type="password" size="10" value="12345" /></td>
                  </tr><tr><td><input type="hidden" name="login_h" value="1" /><input accesskey="l" id="submit_login" name="submit_login" type="submit" value="login" />
                  </td></tr></table></form>';
}


Verder heb ik het reeds geprobeerd met de volgende codes:
PHP:
1
2
3
4
5
// Geprobeerd met deze
unset($_SESSION['username']);

// En met deze
session_destroy();

Heeft iemand enig idee hoe ik dit kan oplossen?
Want ik ben de draad even helemaal kwijt :X

[ Voor 17% gewijzigd door marapuru op 23-03-2006 12:32 . Reden: overbodige enters ]


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 14:49

Cyphax

Moderator LNX
Volgens mij heb ik hier ook weleens tegenaan gehikt.
Voorbeeld hier maar gevolgd:

$_SESSION = array();
session_destroy();

Dan werkt ie hier in ieder geval wel.

[ Voor 10% gewijzigd door Cyphax op 23-03-2006 12:37 ]

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • NaZ-
  • Registratie: Juli 2002
  • Niet online

NaZ-

Hoeblablahoeblabla

Heb je die code op een andere pagina? Je moet je sessie dan wel eerst starten. En welke foutmelding krijg je?

//edit

lama, verkeerd gelezen..
"...als er op login word geklikt dan worden deze gegevens in de sessie geplaatst waardoor de gebruiker altijd netjes blijft ingelogd totdat de browser word afgesloten."

[ Voor 52% gewijzigd door NaZ- op 23-03-2006 12:41 ]

AMD Pentium 4 32+, 2056MB DDR-ROM, 60INCH HD, Logitech Muis, MS-Toeter


Acties:
  • 0 Henk 'm!

Verwijderd

Ben ik nou gek, of komt je niet bij de elseif van regel 11 als je op logout klikt? De sessie bestaat dan toch nog en dan gaat ie direct in de eerste if-tak?

Acties:
  • 0 Henk 'm!

  • marapuru
  • Registratie: September 2004
  • Laatst online: 29-07 12:52
Ligt het misschien aan de code die ik in de index.php heb geplaatst?

De code die in de SP staat is onderdeel van login.php
Globaal ziet mijn index.php er als volgt uit:
PHP:
1
2
3
4
5
6
7
8
9
10
session_start();

// Een hele hoop HTML meuk, design etc.

require('login.php');

// De login message laten zien die is aangemaakt in login.php
echo $login_msg;

// Nog meer HTML meuk, niet van belang.

[ Voor 69% gewijzigd door marapuru op 23-03-2006 12:45 ]


Acties:
  • 0 Henk 'm!

  • Cyphax
  • Registratie: November 2000
  • Laatst online: 14:49

Cyphax

Moderator LNX
NaZ- schreef op donderdag 23 maart 2006 @ 12:38:
Heb je die code op een andere pagina? Je moet je sessie dan wel eerst starten. En welke foutmelding krijg je?
Eh, da's ook waar.. session_start() moet wel aangeroepen zijn in datzelfde script (of in dezelfde run, hoe dan ook), die resumed 'm dan.

Saved by the buoyancy of citrus


Acties:
  • 0 Henk 'm!

  • EdwinV
  • Registratie: Januari 2004
  • Laatst online: 18-04 15:08
Allereerst zal session_unset niet werken. Sinds de invoering van superglobals is deze functie overbodig en kan je een sessie variabele gewoon met de functie unset verwijderen.

Verder sluit ik me helemaal aan bij Boland, waarschijnlijk kom je nooit in de elseif tak. Controleer dat eens met behulp van wat debug regels.

Acties:
  • 0 Henk 'm!

  • marapuru
  • Registratie: September 2004
  • Laatst online: 29-07 12:52
Oh mijn god wat stom.
Excuses hiervoor, zal wel mijn gebrekkige ervaring van PHP zijn. Tuurlijk moet ik eerst controleren of er op die knop is gedrukt voordat ik die sessie ga controleren, die zal altijd nog bestaan :Y)

Het is aangepast. Uiteindelijke werkende code is dus:
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
// Logout knop instellen in de var $logout_button
$logout_button = '<form method="post"><table border="0" cellspacing="0" cellpadding="0"><tr><td>
                  <input accesskey="l" id="submit_logout" name="submit_logout" type="submit" value="Log uit" />
                  </td></tr></table></form>';

// De user wil uitloggen (heeft op logout geklikt).
if ($_SERVER["REQUEST_METHOD"] == "POST" AND isset($_POST['submit_logout'])) {
    echo 'boe';
    // Sessie weghalen
    $_SESSION = array();
    session_destroy();
    // Custom message aanmaken die bij de login wordt weergegeven
    $login_msg = "U bent uitgelogd.<br><a href=index.php>Log in</a>";

// Controleren of de Sessie variabele al is aangemaakt!
} elseif (isset($_SESSION['username'])) {
    // De username en de logout knop weergeven.
    $login_msg = "Welkom " . $_SESSION['username'] . " (" . $_SESSION['userlevel'] . ")" . $logout_button;

// Als de submit_login knop is ingedrukt wordt dit uitgevoerd
} elseif ($_SERVER["REQUEST_METHOD"] == "POST" AND isset($_POST["submit_login"])) {

    // Query opstellen voor het vergelijken van de username/password
    $login_query = mysql_query("SELECT * FROM gebruikers WHERE username = '".$_POST['username']."' AND password = '".$_POST['password']."'");
    // Query uitvoeren, als controle op de username en password
    $login_check = mysql_num_rows($login_query);
    
    // Nakijken of er minimaal 1 rij tevoorschijn is gekomen.
    if ($login_check == 1) {
        
        // De resultaten ophalen en in array plaatsen
        $login_results = mysql_fetch_assoc($login_query);
        
        // De username en userlevel in de sessie plaatsen
        $_SESSION['username'] = $login_results['username'];
        $_SESSION['userlevel'] = $login_results['userlevel'];
        // De login message instellen als de gegevens kloppen en de gebruiker dus is ingelogd.
        $login_msg = "Welkom " . $_SESSION['username'] . " (" . $_SESSION['userlevel'] . ")" . $logout_button;
        
    } else {
        // Foutmelding bij verkeerd ingevoerde gegevens
        $login_msg = 'De inloggegevens zijn niet juist, probeer het opnieuw.';
    }

} else {
    // De Login message instellen op het weergeven van het formulier
    $login_msg = '<form method="post"><table border="0" cellpadding="0" cellspacing="2"><tr><td>Naam / Wachtwoord</td>
                  </tr><td><input accesskey="g" id="username" onFocus="deltext(this)" name="username" type="text" size="10" value="Naam" /></td>
                  <tr><td><input accesskey="p" id="password" onFocus="deltext(this)" name="password" type="password" size="10" value="12345" /></td>
                  </tr><tr><td><input type="hidden" name="login_h" value="1" /><input accesskey="l" id="submit_login" name="submit_login" type="submit" value="login" />
                  </td></tr></table></form>';
}

Bedankt :)

Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 09:15
Haal je er nog wel even de SQL-injectie-mogelijkheden en het clear-text password uit? :P

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • marapuru
  • Registratie: September 2004
  • Laatst online: 29-07 12:52
Kwa beveiliging is het nog allesbehalve waterdicht. Dit is iets wat ik in een later stadium wil gaan optimaliseren. Overigens wordt het gebruikt op een intranet wat enkel intern te benaderen is, waardoor de beveiliging op een iets lager pitje gezet kan worden :)

Thanks for pointing it out though ;)

Acties:
  • 0 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 15:38

Snow_King

Konijn is stoer!

mrmali schreef op donderdag 23 maart 2006 @ 13:03:
Kwa beveiliging is het nog allesbehalve waterdicht. Dit is iets wat ik in een later stadium wil gaan optimaliseren. Overigens wordt het gebruikt op een intranet wat enkel intern te benaderen is, waardoor de beveiliging op een iets lager pitje gezet kan worden :)

Thanks for pointing it out though ;)
1 regel, vertrouw nooit, maar dan ook nooit de input van de gebruiker.

Acties:
  • 0 Henk 'm!

  • marapuru
  • Registratie: September 2004
  • Laatst online: 29-07 12:52
Ik weet dat dat een van de vuistregels is bij programmeren, echter als je net begonnen bent met PHP en je als stageproject de opdracht krijgt een intranet in elkaar te zetten. Dan heb ik liever in eerste instantie het globale idee rond voordat ik me zorgen ga maken over diep zittende beveiligings problemen. (Helemaal met mijn kennis).

offtopic:
Heb jij niet ook ooit een keer in THT gezeten?

Acties:
  • 0 Henk 'm!

Verwijderd

Sessies afsluiten:
- Sessiedata verwijderen:
PHP:
1
$_SESSION = array();


- Sessiecookies verwijderen:
PHP:
1
2
3
4
if (isset($_COOKIE[session_name()]))
{
    setcookie(session_name(), '', time() - strtotime('-1 year'), '/');
}


- Sessie afsluiten:
PHP:
1
session_destroy();


En je kan beter vanaf begin veiligheid als prioriteit stellen. Dan gaat dat vanzelf automatisch :) .

Sessies die hierna nog leven: Custom Sessiesyteem met fouten?

PS:
http://nl2.php.net/manual...ql-real-escape-string.php ;)

[ Voor 12% gewijzigd door Verwijderd op 23-03-2006 14:07 ]

Pagina: 1