[php] sessies logout werkt niet goed?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

Topicstarter
Ik ben bezig met een klein cms'je voor een website.

Alleen heb ik een vaag probleemje met m'n sessies.

Zodra een gebruiker inlogd komt de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$query = "select * from users where username='{$_POST['user']}' and password='{$_POST['pass']}'";
$result = mysql_query($query);
$fetch = mysql_fetch_assoc($result);
$num_rows = mysql_num_rows($result);

if($num_rows > 0) {
    session_start();

    $_SESSION['pkUserID'] = $fetch['pkUserID'];
    $_SESSION['username'] = $fetch['username'];
    $_SESSION['password'] = $fetch['password'];

    header("Location: ../nieuws.php");
} else {
    print("<script>alert(\"Gebruikersnaam of wachtwoord onjuist!\"); location.replace(\"../index.html\"); </script>");
    die();
}


En op elke pagina wordt deze include gebruikt om te controleren of de sessie wel klopt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
session_start();
session_cache_limiter('private, must-revalidate');

if(!isset($_SESSION['pkUserID'])) {
    session_destroy();
    header("Location: {$html_path}index.html");
    die();
}

$query = "select * from users where username='{$_SESSION['username']}' and password='{$_SESSION['password']}' and pkUserID={$_SESSION['pkUserID']}";
$result = mysql_query($query);

if(mysql_num_rows($result) < 1) {
    session_destroy();
    header("Location: {$html_path}index.html");
    die();
}

unset($fetch);


En als laatste om uit te loggen heb ik de volgende code:

PHP:
1
2
3
4
5
6
7
8
$_SESSION['pkUserID'] = "";
$_SESSION['username'] = "";
$_SESSION['password'] = "";

session_destroy();
header("Location: index.html");
die();
?>


Het lijkt allemaal goed te gaan. En ik kom terug in index.html waar het inlog formulier zich bevindt.

Alleen als ik nu op de back knop druk in m'n browser, werkt dat gewoon en ben ik nog steeds ingelogd?

Ik heb de sessie gekilled en php roept die dan spontaan weer in leven?

Ik heb het gecontroleerd door de sessie variablen op te roepen binnen script in het cms, maar die leven dus vrolijk door.

Weet iemand wat ik verkeerd doe?

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • bigben04
  • Registratie: December 2001
  • Laatst online: 30-08 20:47
Heb je na het drukken op de Back knop op Refresh/Reload geklikt?

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

Topicstarter
bigben04 schreef op 26 september 2003 @ 14:12:
Heb je na het drukken op de Back knop op Refresh/Reload geklikt?
Ja, dat heb ik gedaan. Sterker nog ik kan nog gewoon vrolijk door het cms heen wandelen, en m'n sessie variablen blijven bekend.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • bigben04
  • Registratie: December 2001
  • Laatst online: 30-08 20:47
Wat als je :
PHP:
1
2
3
$_SESSION['pkUserID'] = "";
$_SESSION['username'] = "";
$_SESSION['password'] = "";

vervangt door:
PHP:
1
2
3
unset($_SESSION['pkUserID']);
unset($_SESSION['username']);
unset($_SESSION['password']);


Edit: volgens het commentaar van 'jrshank' op http://www.php.net/manual/en/function.unset.php kan het ook zijn dat je dit moet doen:
PHP:
1
2
unset($_SESSION['pkUserID']);
session_unregister($pkUserID);

[ Voor 71% gewijzigd door bigben04 op 26-09-2003 14:34 ]


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

Topicstarter
bigben04 schreef op 26 September 2003 @ 14:30:
Wat als je :
PHP:
1
2
3
$_SESSION['pkUserID'] = "";
$_SESSION['username'] = "";
$_SESSION['password'] = "";

vervangt door:
PHP:
1
2
3
unset($_SESSION['pkUserID']);
unset($_SESSION['username']);
unset($_SESSION['password']);


Edit: volgens het commentaar van 'jrshank' op http://www.php.net/manual/en/function.unset.php kan het ook zijn dat je dit moet doen:
PHP:
1
2
unset($_SESSION['pkUserID']);
session_unregister($pkUserID);
unset geeft hetzelfde resultaat. En session_unregister was meen ik alleen nodig als global vars aanstond. Maar dat zal ik ook nog even proberen.

Bedankt tot zover iig!!

[ Voor 12% gewijzigd door me1299 op 26-09-2003 14:49 ]

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

Verwijderd

Welke versie van PHP heb je? Ik heb zelf een vergelijkbaar probleem gehad met sessies met mijn host die een oudere versie van PHP gebruikt (nl. 4.0.6).

Met oude versies werkt $_SESSION['var'] = "bla"; niet, maar op de een of andere vage manier werkte $HTTP_SESSION_VARS['var'] = "bla"; ook niet. Daar moest ik dus het volgende doen:
PHP:
1
2
$var = "bla";
session_register("bla");


Overigens vind ik je code een erg vreemde structuur hebben.
1) Je zegt met dit stukje code bijv. :
PHP:
1
2
3
4
5
if(!isset($_SESSION['pkUserID'])) { 
    session_destroy(); 
    header("Location: {$html_path}index.html"); 
    die(); 
}

Als de sessie variabele 'pkUserID' niet is geïnitialiseerd dan moet de sessie verwijderd worden, maar die sessie variabele bestaat helemaal niet wanneer er geen sessie is, dus dan hoeft de sessie ook niet vernietigd te worden.

2) In de PHP docs staat bij session_destroy(); de volgende note:
PHP:
1
2
3
4
5
6
7
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
// Unset all of the session variables.
$_SESSION = array();
// Finally, destroy the session.
session_destroy();

Gebruik dus $_SESSION = array(); ipv het toekennen van de waarde "" aan de losse variabelen. Als een variabele de waarde "" heeft is ie namelijk niet unset/NULL.

Ik stel om de volgende control-structure te gebruiken om te checken of de sessie wel echt vernietigd is: (bijv.)
PHP:
1
2
3
4
5
if (session_destroy()) {
  echo "Sessie is verwijderd";
} else {
  echo "Sessie kon niet verwijderd worden";
}


Lees goed alle notes door op http://nl2.php.net/manual/en/ref.session.php . Check welke versie van PHP je draait en check op die pagina welke methode je het beste kan gebruiken.

Succes!

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

Topicstarter
Verwijderd schreef op 26 September 2003 @ 15:13:
Welke versie van PHP heb je? Ik heb zelf een vergelijkbaar probleem gehad met sessies met mijn host die een oudere versie van PHP gebruikt (nl. 4.0.6).

Met oude versies werkt $_SESSION['var'] = "bla"; niet, maar op de een of andere vage manier werkte $HTTP_SESSION_VARS['var'] = "bla"; ook niet. Daar moest ik dus het volgende doen:
PHP:
1
2
$var = "bla";
session_register("bla");


Overigens vind ik je code een erg vreemde structuur hebben.
1) Je zegt met dit stukje code bijv. :
PHP:
1
2
3
4
5
if(!isset($_SESSION['pkUserID'])) { 
    session_destroy(); 
    header("Location: {$html_path}index.html"); 
    die(); 
}

Als de sessie variabele 'pkUserID' niet is geïnitialiseerd dan moet de sessie verwijderd worden, maar die sessie variabele bestaat helemaal niet wanneer er geen sessie is, dus dan hoeft de sessie ook niet vernietigd te worden.

2) In de PHP docs staat bij session_destroy(); de volgende note:
PHP:
1
2
3
4
5
6
7
// Initialize the session.
// If you are using session_name("something"), don't forget it now!
session_start();
// Unset all of the session variables.
$_SESSION = array();
// Finally, destroy the session.
session_destroy();

Gebruik dus $_SESSION = array(); ipv het toekennen van de waarde "" aan de losse variabelen. Als een variabele de waarde "" heeft is ie namelijk niet unset/NULL.

Ik stel om de volgende control-structure te gebruiken om te checken of de sessie wel echt vernietigd is: (bijv.)
PHP:
1
2
3
4
5
if (session_destroy()) {
  echo "Sessie is verwijderd";
} else {
  echo "Sessie kon niet verwijderd worden";
}


Lees goed alle notes door op http://nl2.php.net/manual/en/ref.session.php . Check welke versie van PHP je draait en check op die pagina welke methode je het beste kan gebruiken.

Succes!
Bedankt voor je reactie!

Ik draai php 4.2.4-dev onder netware.

Ook de array legen werkt niet.

session_register gebruikt je alleen als global vars uitstaat op de server. Ik heb geen idee waarom het niet werkt, want op een andere site draaiend op dezelfde server gaat het wel goed. Maar na lang kijken zie ik verder echt geen verschil.

En die sessie checken doe ik gewoon standaard. Mocht het zo zijn dat mensen zitten te kloten door sessies te faken, kan ik daar heel sporadisch misschien ook nog wat uitfilteren.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ik vind dit :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// [.. knip ..]

$query = "select * from users where username='{$_SESSION['username']}' and password='{$_SESSION['password']}' and pkUserID={$_SESSION['pkUserID']}";
$result = mysql_query($query);

if(mysql_num_rows($result) < 1) {
    session_destroy();
    header("Location: {$html_path}index.html");
    die();
}

unset($fetch);

edit:
[quote]Mocht het zo zijn dat mensen zitten te kloten door sessies te faken[/quote]
hoe fake je een sessie dan? :?


trouwens ook nogal vaag? beetje overdone om bij iedere page request nog eens te gaan controleren of de in de sessie opgeslagen username en password nog steeds voorkomen in de database 8)7
Vind het zowiezo niet slim om het password in de sessie op te slaan. Mocht om wat voor'n reden dan ook je sessie informatie per ongeluk geëchod worden dan ligt dat password dus bloot.

Verder, weet je zeker dat je niet per ongeluk een lege username en wachtwoord in je database heb staan?

en anders: echo die pkUserID in je sessie even na het unsetten (die header() werkt dan wel niet meer, maar even om te debuggen), en echo 'm ook nog een keer na die redirect). dan weet je waar het aan ligt.
met simpel = "" had dit inderdaad nooit gewerkt, want dan is ie nog steeds gezet. maar met een unset zou die niet door de isset() heen mogen komen

edit:
Mocht het zo zijn dat mensen zitten te kloten door sessies te faken
hoe fake je een sessie dan? :?

[ Voor 14% gewijzigd door marty op 26-09-2003 16:47 ]


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
marty schreef op 26 September 2003 @ 16:45:
[...]

hoe fake je een sessie dan? :?
Dat is relatief eenvoudig. Je moet gewoon zorgen dat PHP 'denkt' dat jouw computer bij een andere sessie hoort. Zoals je weet heeft iedere sessie een nummer, dus als je het nummer van een sessie weet die op een andere computer draait en dan zorgt dat jouw computer dat nummer gebruikt bij ieder request aan de site, dan fake je een sessie :)

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
ok, dat kan. maar daar doe je toch niets tegen. als ik iemand anders z'n sessie overneem op die manier dan 'heb' ik gelijk alle waardes die in die sessie zitten en heeft een verdere controle dus ook weinig zin.

ik dacht dat de ts bedoelde met faken dat je iets deed waardoor er zomaar ineens een sessie ontstond....

[ Voor 24% gewijzigd door marty op 26-09-2003 19:32 ]


Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Vergelijk het ip-adres waar iemand vandaan komt ( niet 75% bescherming, maar toch beter dan 0% via php-referer en user-ipadres) en dan heb je iets meer houvast. Session hijacking is voor "echte" gebruikers (/hackers / crackers ) bijna niet te blocken omdat http stateless is, maar een heleboel dingen controleren kan wel een stuk beter beschermen.

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

Topicstarter
marty schreef op 26 September 2003 @ 16:45:
ik vind dit :

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// [.. knip ..]

$query = "select * from users where username='{$_SESSION['username']}' and password='{$_SESSION['password']}' and pkUserID={$_SESSION['pkUserID']}";
$result = mysql_query($query);

if(mysql_num_rows($result) < 1) {
    session_destroy();
    header("Location: {$html_path}index.html");
    die();
}

unset($fetch);

edit:
[quote]Mocht het zo zijn dat mensen zitten te kloten door sessies te faken[/quote]
hoe fake je een sessie dan? :?


trouwens ook nogal vaag? beetje overdone om bij iedere page request nog eens te gaan controleren of de in de sessie opgeslagen username en password nog steeds voorkomen in de database 8)7
Vind het zowiezo niet slim om het password in de sessie op te slaan. Mocht om wat voor'n reden dan ook je sessie informatie per ongeluk geëchod worden dan ligt dat password dus bloot.

Verder, weet je zeker dat je niet per ongeluk een lege username en wachtwoord in je database heb staan?

en anders: echo die pkUserID in je sessie even na het unsetten (die header() werkt dan wel niet meer, maar even om te debuggen), en echo 'm ook nog een keer na die redirect). dan weet je waar het aan ligt.
met simpel = "" had dit inderdaad nooit gewerkt, want dan is ie nog steeds gezet. maar met een unset zou die niet door de isset() heen mogen komen

edit:

[...]

hoe fake je een sessie dan? :?
Ik moet je gelijk geven dat het een beetje overdone is allemaal :)

Dat hele sessie gebeuren was ook maar een snelle opzet, en het werkte behalve de bovenstaande fout goed.

Maar dat doet verder niet af aan het feit dat de sessie spontaan tot leven komt als de browser terug gaat. Of het is misschien zo dat de sessie nooit echt verdwenen is. Ik zit nu thuis, en zal er maandag op m'n gemakje nog eens naar kijken.

Ik vind trouwens wel dat als je een user verwijderd, dat hij niet meer door mag gaan tot z'n sessie verloopt. Dus checken of de gegevens nog in de database aanwezig zijn lijkt me wel belangrijk.

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Verwijderd

if(!isset($_SESSION['pkUserID'])) {
session_destroy();
header("Location: {$html_path}index.html");
die();
}
Je moet ook controleren of de verschillende sessie variabelen ook gezet zijn, dus...
PHP:
1
2
3
4
5
6
if (!((isset($_SESSION['pkUserID']) && !empty($_SESSION['pkUserID'])) &&
    (isset($_SESSION['username']) && !empty($_SESSION['username'])) &&
    (isset($_SESSION['password']) && !empty($_SESSION['password']))
   ))
{  /* blabla */
}
DeathKnight schreef op 26 September 2003 @ 23:58:
[...]


Ik moet je gelijk geven dat het een beetje overdone is allemaal :)

Dat hele sessie gebeuren was ook maar een snelle opzet, en het werkte behalve de bovenstaande fout goed.

Maar dat doet verder niet af aan het feit dat de sessie spontaan tot leven komt als de browser terug gaat. Of het is misschien zo dat de sessie nooit echt verdwenen is. Ik zit nu thuis, en zal er maandag op m'n gemakje nog eens naar kijken.
De sessievariabelen worden niet verwijderd. (bug in PHP? Ik heb er ook last van. PHP 4.3.3) Kijk maar in het sessiebestandje.

  • flashin
  • Registratie: Augustus 2002
  • Laatst online: 17-12-2023
Vind het zowiezo niet slim om het password in de sessie op te slaan. Mocht om wat voor'n reden dan ook je sessie informatie per ongeluk geëchod worden dan ligt dat password dus bloot.
Ik gebruik zelf wel een password session (dubbele md5-hash), maar dan userid, username & password constructie erin :9, en dan checkken of het klopt met de data in de database.. is op zich veilig :p

ik zou het niet controleren met een ip, ik weet niet of je mensen kent met een dynamisch ip, maar dat is vrij onhandig..

[ Voor 15% gewijzigd door flashin op 27-09-2003 18:57 ]


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 21:55

me1299

$ondertitel

Topicstarter
Ik ben er inmiddels achter wat het probleem was. Ik had op m'n server op het werk error reporting niet standaard aan staan. Waardoor ik niet doorhad de bepaalde includes niet werkten. Daardoor ging het dus fout :X

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • x-man
  • Registratie: September 2001
  • Laatst online: 22-08 12:38

x-man

Proud newbie!

DeathKnight schreef op 03 October 2003 @ 15:29:
Ik ben er inmiddels achter wat het probleem was. Ik had op m'n server op het werk error reporting niet standaard aan staan. Waardoor ik niet doorhad de bepaalde includes niet werkten. Daardoor ging het dus fout :X
Vraag en antwoorden waren toch interresant :)

Better a newbie in one hand then ten wannabe-hacker-scriptkiddies on your server.

Pagina: 1