[php] cookie & sessie login

Pagina: 1
Acties:
  • 208 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een membersysteem, en hier zit natuurlijk ook een login bij. Ik gebruik nu sessies en deze voldoen mij goed en het werkt ook allemaal prima. Maar ik wil er eigenlijk ook voor zorgen dat als je een vinkje aandrukt dat je dan ingelogd blijft voor een bepaalde tijd. Ik moet dus gebruik gaan maken van cookies. Maar ik vraag me af hoe ik dit moet doen ?

Ik sla de volgende dingen in een sessie op:
- Status
- Gebruikersid
- Login (1)

Een beveiligde pagina geef ik op deze manier toegang voor de members:
PHP:
1
2
3
4
5
6
7
if ($_SESSION['login']){
  $gebruikersid =  ($_SESSION['gebruikersid']);
  echo "je bent ingelogd";
  if ($_SESSION['level'] == '2') {
    echo "dit is voor de admin";
  }
}


Ik wil dit stukje eigenlijk bewaren voor een beveiligde pagina, anders moet ik alle pagina's weer gaan wijzigen.

Nou nog even wat in mijn index.php staat:

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
session_start();
include ("config/config.php");

if ($_GET['action'] == "uitloggen") {
  session_unset();
}

if($_POST["loginsubmit"]) {  
 
  $naam = $_POST["gebruikersnaam"];  
  $wachtwoord = $_REQUEST["wachtwoord"];   
  $wacht = md5($wachtwoord);  
  
  $loginquery = mysql_query("SELECT * FROM members WHERE gebruikersnaam='$naam' && wachtwoord='$wacht'")    or die(mysql_error());     
 
  if ($naam == "") {
    $error = "[img]'config/img/attention.gif'[/img] Geen gebruikersnaam ingevuld";
  }
  elseif ($wachtwoord == "") {
    $error = "[img]'config/img/attention.gif'[/img] Geen wachtwoord ingevuld";
  }
  elseif(mysql_num_rows($loginquery) == 0)  { 
   $error = "[img]'config/img/attention.gif'[/img] Gegevens komen niet overeen";
  } else {   
    if(mysql_num_rows($loginquery) == 1) { 
      if (mysql_result($loginquery, 0, "ban") == 1) {
        $error = "[img]'config/img/attention.gif'[/img] Je bent gebanned";
        
      } else {
      
        $login = true;     
        $level = mysql_result($loginquery, 0, "level");   
        $gebruikersid = mysql_result($loginquery, 0, "id");   
    
        if($_POST['autologin']) {
                    // ??????????????????????????????
        }
    
                    $_SESSION["login"] = $login; 
        $_SESSION["level"] = $level; 
        $_SESSION["gebruikersid"] = $gebruikersid;
      } 
    }
  }
}


Ik hoop dat jullie een beetje snappen wat ik nou wil. Graag wat tips zodat ik weet hoe ik dit het beste aan kan pakken.

Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Je hebt twee opties: Ten eerste heb je de mogelijkheid om je sessie tijd te verlengen, dit kan je doen aan de hand van je vinkje ;) Ten tweede een eigen sessiemanager schrijven zoals hier op GoT.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Kan je een sessie tijd verlengen naar een jaar bijvoorbeeld dan ?
Eigenlijk wil ik het toch met cookies doen maar wat moet ik daar in opslaan en daar weer uit halen om zo ook met de sessies te werken ?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je je sessie zomaar verlengt blijf je wel ingelogd, maar dan moet je browser wel open blijven staan...toch? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Dan stop je het userid en het md5 encrypted password in een cookie met een lifetime van een 1 jaar. Bij elke request controleer je op het bestaan van het cookie en controleer je of de gegevens in de db overeenkomen met wat er in het cookie staat. Ook is het netjes om bij elke request de tijdvan het cookie opnieuw in te stellen zodat na de laatste request ook daadwerkelijk het cookie een jaar bestaat.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
maar hij moet eigenlijk checken of die cookie bestaat en zo de juiste gebruiker (gebruiksid in cookie) daar bij zoeken zodat hij daar een sessie bijmaakt met de bijhorende gegevens.

hoe doe ik dit ?

Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 17:49

ripexx

bibs

Je gebruikt nu toch al een database. Maak dan je eigen sessie manager. Zo moeilijk is het niet ;) Zodra je inlogged wordt er een unique nummer/string aangemaakt welke je simpel in een cookie plaatst. Je koppelt dan in de database tabel dit nummer aan user id, ip en eventueel een aantal andere variabelen.

Door met je cookie lifetime te spelen kan je de login duur beperken en als men uitlogged verwijder je het unique nummer uit de tabel. Dus is de koppeling weg en je kan dan dus niet meer inloggen. :) Simpel en goed te beveiligen.

Als je daarentegen gebruik wil maken van wat geavanceerder opteis binnen sessie enz dan wordt het schrijven van een sessie handler wat lastiger, zeker als je veel verschillende variabelen wil gaan koppelen.

buit is binnen sukkel


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok! zo'n sessie manager is ook een idee, maar ik hou het liever eerst hierbij. Ik heb nu het volgende is dit een beetje logisch ??

Dit heb ik onderaan mijn index.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
..
.   

} else {
      
        $login = true;     
        $level = mysql_result($loginquery, 0, "level");   
        $gebruikersid = mysql_result($loginquery, 0, "id");   
    
        if($_POST['autologin']) {
          setcookie("gebruikersid",$gebruikersid,time()+3600);
          setcookie("login",$login,time()+3600);
        }
    
        $_SESSION["login"] = $login; 
        $_SESSION["level"] = $level; 
        $_SESSION["gebruikersid"] = $gebruikersid;
      } 
    }
.
..
...


En dit erboven:
PHP:
1
2
3
4
5
6
if($HTTP_COOKIE_VARS["login"]){
$gid = $HTTP_COOKIE_VARS["gebruikersid"]; 
$log = $HTTP_COOKIE_VARS["login"]; 
$_SESSION["login"] = $log; 
$_SESSION["gebruikersid"] = $gid; 
}


Dit werkt op zich wel maar is dit een beetje logisch en goed. Ik haal de status dan wel uit de database via de userid.

Acties:
  • 0 Henk 'm!

Verwijderd

$HTTP_COOKIE_VARS == oud, je kan beter gebruik maken van $_COOKIE["gebruikersid"]

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Kewl, nu hoef ik alleen maar 2 cookies aan te maken en ik kan mezelf inloggen als elke willekeurig lid :D.

maw. In dit soort gevallen is security punt 1 waar je aan moet denken. De rest komt daarna (en nee, je moet ook geen wachtwoorden op gaan slaan in de DB een cookie)

Kijk trouwens ook eens in de php manual bij sessies. Volgens mij is er namelijk een setting waarmee je de lifetime van een sessie aan kunt geven ;)..


--edit--

Te snel getikt |:( |:(

[ Voor 7% gewijzigd door Janoz op 30-03-2004 14:05 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

zodra de browser gesloten wordt zal de sessie toch echt gestopt worden... en volgens mij wordt het doel dan niet bereikt...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Geen wachtwoorden in database opslaan ? waar moet je ze dan laten ?

en wat moet je dan in de cookie zetten om als elke gebruiker er in te kunnnen komen ?

Acties:
  • 0 Henk 'm!

Verwijderd

omdat je direct al de waarde vanuit het cookie de sessie inschopt... misschien slim om ze voordat je ze in de sessie stopt te controleren of ze kloppen???
PHP:
1
2
3
4
5
6
7
8
if(isset($COOKIE["login"]) && isset($COOKIE["gebruikersid"]))
{ 
  $gid = $_COOKIE["gebruikersid"]; 
  $log = $_COOKIE["login"]; 
  // controleer of de combi $gid en $log éénmaal voorkomt in de db
  $_SESSION["login"] = $log; 
  $_SESSION["gebruikersid"] = $gid; 
}

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het nu op deze manier gedaan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if ($_GET['action'] == "uitloggen") {
  
  setcookie("gebruikersid"); 
   setcookie("login");
   session_unset();
}

if(isset($_COOKIE["login"]) && isset($_COOKIE["gebruikersid"])) 
{ 
  $gid = $_COOKIE["gebruikersid"]; 
  $log = $_COOKIE["login"]; 

  $cookielogin = mysql_query("SELECT * FROM members WHERE id='$gid'");
  $toon = mysql_fetch_object($cookielogin);
  $status = "$toon->level";
  
  $_SESSION["level"] = $status; 
  $_SESSION["login"] = $log; 
  $_SESSION["gebruikersid"] = $gid; 
}


Alleen nog even een paar vraagjes:
Ik heb dit in mijn index.php dus elke keer als je een pagina opent maakt hij weer opnieuw die sessies aan is dit niet wat overbodig ?

En met het uiloggen werkt het ook niet helemaal, je moet namelijk vernieuwen voordat je echt uigelogd bent. Dit heb ik niet als ik alleen de sessie gebruik !

Acties:
  • 0 Henk 'm!

Verwijderd

het refresh probleem is op te lossen door de juiste headers toe te voegen zodat de pagina niet uit de cache wordt gehaald.

Bij het inloggen maak je een sessie aan. Verder controleer je op elke pagina alleen of de waarde uit de sessie kloppen -> zo nee; bestaan er correcte waarde in een cookie, maak dan een nieuwe sessie aan -> zo nee; redirect naar de login page

... o.i.d.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
misschien een beetje domme vraaag maar hoe werkt zo'n header ik heb dit bij mijn uitlog:

if ($_GET['action'] == "uitloggen") {

session_unset();
setcookie("gebruikersid");
setcookie("login");

}

moet er iets van header("location: ???"); komen maar wat en waar ?

Acties:
  • 0 Henk 'm!

Verwijderd

op deze pagina zou je eens moeten zoeken over headers en cache. Headers moet je altijd versturen voordat er wat gerpint wordt naar het scherm...

http://nl3.php.net/header

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
thx, dat met die headers is gelukt. Ik zie ook dat het toch veiliger moet. Je hoeft alleen maar het idnummer in de cookie te veranderen en je bent als een ander ingelogd. Als ik die nu codeer door middel van md5 is het dan wel veilig ?

Acties:
  • 0 Henk 'm!

  • flexje
  • Registratie: September 2001
  • Laatst online: 16:57

flexje

got-father

Verwijderd schreef op 30 maart 2004 @ 15:07:
thx, dat met die headers is gelukt. Ik zie ook dat het toch veiliger moet. Je hoeft alleen maar het idnummer in de cookie te veranderen en je bent als een ander ingelogd. Als ik die nu codeer door middel van md5 is het dan wel veilig ?
Mja het is dan veiliger. Maar wat is echt veilig.... :)

"Try not to become a man of success but rather to become a man of value..."


Acties:
  • 0 Henk 'm!

  • simon
  • Registratie: Maart 2002
  • Laatst online: 00:18
Een stuk veiliger zou het zijn als je een sessie systeem werkt, die per sessie een unieke id gebruikt, die niet zomaar te achterhalen is :)

|>


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik sla nu alleen de gebruikersid in de cookie op deze wil ik dan md5 gecodeerd hebben. Dit lukt wel alleen ik krijg hem er niet meer uit.

PHP:
1
2
3
4
        if($_POST['autologin']) {
          $cid = md5($gebruikersid);
          setcookie("gebruikersid",$cid,time()+3600);
        }


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
if($_COOKIE["gebruikersid"]){
if($_SESSION["level"] || $_SESSION["gebruikersid"] || $_SESSION["login"]){
} else {
  $gid = md5($_COOKIE["gebruikersid"]); 
  $log = true;
  $login = mysql_query("SELECT level FROM members WHERE id='$gid'") or die (mysql_error());  
  $levellogin = mysql_result($login, 0, "level");   

  $_SESSION["level"] = $levellogin; 
  $_SESSION["login"] = $log; 
  $_SESSION["gebruikersid"] = $gid; 
  }
}


Nou krijg ik de volgende foutmelding:
Warning: mysql_result(): Unable to jump to row 0 on MySQL result index 4 in C:\Webserver\www\site\index.php on line 18

Acties:
  • 0 Henk 'm!

Verwijderd

in je code ga je de md5 gecodeerde userid nog een keer coderen en die opzoeken in je database. Die zal je dus niet vinden... je zal in je database ook de userid als md5 in een aparte kolom moeten opslaan, dan kan je matchen op die kolom. md5 is onomkeerbaar, dus terug transformeren is onmogelijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hmmmm zit ik daar weer mee.. dus nou zou ik die id in de database ook md5 moeten geven. Maar dan heeft die zo'n irritante lange code, en is er weer moeilijk te linken naar een bepaalde id !? Hoe kan ik het dan even op een soortgelijke manier oplossen ?

Acties:
  • 0 Henk 'm!

Verwijderd

als je je record gevonden hebt kan je verder toch gewoon gebruik maken van je gewone id (waarschijnlijk is dat een integer met een auto increment)?

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Wat ik zelf doe is een sessie tabel bijhouden en in de cookie komt alleen een session id te staan, verder niets. Deze tabel bevat username, session id, ip adres, starttijd

De gebruikers wachtwoorden staan md5 encrypt in een user tabel. Deze wordt alleen gebruikt tijdens het inloggen, niet voor het controleren of een sessie nog geldig is.

Het gaat als volgt:
-user logt in -> username + pass controleren
-session id wordt aangemaakt en in de sessie tabel gezet waarbij de vorige sessie van een user wordt overschreven als deze bestaat(je kan dus maar op 1 PC tegelijkertijd ingelogt zijn dan)
Controleren of iemand is ingelogt:
-cookie opvragen -> session id uitlezen
-controleren of de sessie niet verlopen is aan de hand van de start tijd die in de session tabel staat
-als de sessie nog geldig is een variable ingelogt op jazeker oid zetten en een variable logged_in_user van de juiste naam voorzien. Je kan ook nog andere vars meegeven zoals user_level enz.


Dit werkt voor zover ik weet redelijk veilig. In het geval dat je cookie gestolen wordt kan de kwaaddoener er nog niets mee omdat de sessie aan een ip gebonden is(dialuppers hebben dan maar lekker pech :P) Een ip spoofen met tcp/ip lijkt me nogal lastig aangezien de website dan naar het gespoofte ip gestuurt wordt. Bovendien wordt er in de cookie alleen een session id opgeslagen en kunnen de username/password nooit achterhaald worden.

[ Voor 6% gewijzigd door Blorgg op 01-04-2004 10:08 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
of ik moet gewoon een nieuw veld aanmaken in de database bedoel je ?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nou ik moet dan toch maar met een sessie tabel gaan werken zie ik !? maar heeft iemand misschien hier ook een tutorial of een voorbeeldscript van zodat ik even kan kijken hoe die dat hebben ?

Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Ga gewoon de stappen na die nodig zijn en script dat. Dus bv met het inloggen:
-de geposte username/password ophalen
-md5 hash over het geposte password heen en vergelijken met het md5 'gehashte' pass in de user tabel
-controleren of de user nog een sessie heeft 'open staan'
-session id aanmaken
-session id en ip in de session tabel overschrijven voor de user als de user een sessie had, anders nieuwe entry
-enz
-enz

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nog ff 1 vraagje

hoe maak ik die session id aan en/of wat moet daar in staat ?

Acties:
  • 0 Henk 'm!

  • youngster
  • Registratie: Maart 2004
  • Laatst online: 20-05 09:48
Blorgg schreef op 01 april 2004 @ 10:07:

Dit werkt voor zover ik weet redelijk veilig. In het geval dat je cookie gestolen wordt kan de kwaaddoener er nog niets mee omdat de sessie aan een ip gebonden is(dialuppers hebben dan maar lekker pech :P)
Iedereen heeft het altijd over je sessie aan een ip koppelen, maar volgens mij heeft dit weinig nut. Het grootste risico voor het stelen van een cookie is dat dit gebeurt door je collega op kantoor, op een bedrijfsnetwerk, dus... achter dezelfde router, dus... met hetzelfde IP... IMHO

Real programmers don't comment their code... it was hard to write, it should be hard to read!


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Een session id aanmaken doe ik redelijk lomp, maar het werkt wel ;)
PHP:
1
2
3
4
$mtime = microtime(); 
$session_id = session_id();
$session_id = $session_id . $mtime[0];
$session_id = md5($session_id);
youngster schreef op 01 april 2004 @ 11:14:
[...]


Iedereen heeft het altijd over je sessie aan een ip koppelen, maar volgens mij heeft dit weinig nut. Het grootste risico voor het stelen van een cookie is dat dit gebeurt door je collega op kantoor, op een bedrijfsnetwerk, dus... achter dezelfde router, dus... met hetzelfde IP... IMHO
Het is ook heel erg dom om op een publieke computer zoals op je werk ingelogt te blijven. Op school of op je werk moet je daarom ook gewoon altijd uitloggen als je klaar bent. Maar dan nog, als je collega's jouw account gaan kraken om zo bij je cookies te komen dan verdienen zij het om op staande voet ontslagen te worden. En als je systeembeheerder alle accounts en hun persoonlijke mappen op elke PC waar ze inloggen laat staan dan zou je je af kunnen vragen of het misschien niet veiliger is om dat te veranderen.
Pagina: 1