[PHP] Ingelogd blijven met sessies

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Ik heb een login script geschreven m.b.v. sessies. Nu wil ik zorgen dat mensen kunnen aanvinken dat ze ingelogd blijven. Dus als ze ingelogd zijn en twee weken later weer naar de zelfde site gaan niet opnieuw hoeven in te loggen totdat ze handmatig uitloggen. Ik weet niet zo goed hoe ik dit kan doen met sessies. ik lees wel overal dat dit met cookies kan, maar weet niet op ik die nu ook moet gebruiken of dat ik het met een sessie kan doen. Ik heb natuurlijk al het een en ander geprobeerd, door b.v. de sessielengte verlengen maar zodra het venster wordt gesloten is en de pagina opnieuw wordt geopend wordt is de sessie niet meer geldig.
Als ik dit met cookies moet doen (nog nooit mee gewerkt), hoe ik kan ik dit het veiligst doen zonder af te moeten stappen van het huidige inlog systeem.

Ik gebruik een class om de mysql query's uit te voeren.
Het login form heeft een hidden input met de naam "login" an de value "1".

login script (form even weggelaten, spreekt voor zich)
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
if(isset($_POST['login'])){
  $login_naam = $_POST['login_uname'];
  $login_ww = $_POST['login_pass'];
  
    if($db->num_rows('SELECT * FROM ' .$TABLE_naam. ' WHERE login_web = "' .$login_naam. '" AND pass_web = "' .$login_ww. '"') > 0) 
    { 
        $login_data = $db->get_array( );
        
           if($login_data[0]['actief'] != 0){
            $vn = $login_data[0]['voornaam'];
            $tv = $login_data[0]['tussenvoegsel'];
            $an = $login_data[0]['achternaam'];
            $sessieVar->login = $_POST['login'];
            $sessieVar->volNaam_2 = $vn ." ". $tv ." ". $an;
            $sessieVar->uId = $login_data[0]['id'];
            session_register("sessieVar");
            
            echo "<META HTTP-EQUIV=\"REFRESH\" CONTENT=\"0; URL=weergeven.php?SessionID=" .session_id(). "\">";
           }else{
              echo "Met deze login gegevens kan niet meer ingelogd worden<BR> omdat de gebruiker niet meer actief is.\n";
           }
    }else{
        echo "De gebruikersnaam of het wachtwoord klopt niet.\n";
    }
}



Op elke pagina wordt op de volgende manier gecontroleerd of iemand is ingelogd.
PHP:
1
2
3
4
5
6
7
8
9
session_start();
if($sessieVar->login == 1 && session_id() == $_REQUEST['SessionID'])
{
......
}
else
{
     header("Location: login.php");
}

Acties:
  • 0 Henk 'm!

  • MadMurdock
  • Registratie: Oktober 2000
  • Niet online
Wat je zou kunnen doen om je huidige systeem uit te breiden is het volgende:

Op het moment dat een gebruiker inlogt (dus wanneer jij een nieuwe sessie start), dan maak je ook een cookie aan. In dit cookie zet je een uniek ID. In een database sla je dit ID ook op, en koppel je het eventueel aan een IP-adres.

Wanneer een gebruiker nu terugkomt (er is dus nog geen actieve sessie), dan controleer je eerst of zijn cookie met het ID nog bestaat, zo ja, controleer je of dat ID ook nog in jouw database zit en of het IP-adres wat daarbij staat ook nu weer klopt met dat van de gebruiken.

Als dat allemaal goed is, dan start je gewoon je normale session weer.

Dit kan je eventueel nog uitbreiden met md5-hashes, mogelijkheid om bepaalde sessies uit te loggen, challenge-response enzenzenz..

Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Bedankt! Ik ga er gelijk even mee stoeien. :)

Acties:
  • 0 Henk 'm!

  • liledevil
  • Registratie: Oktober 2002
  • Laatst online: 15-01-2024

liledevil

DELL EVIL I

Ik begrijp dat je je inlogscript niet te veel wilt veranderen,
maar ik zou toch nog wat wijzegingen doorvoeren ivm de veiligheid

persoonlijk heb ik meestal een authenticatie module in de vorm van
PHP:
1
2
3
4
5
6
7
8
9
<?php
if ($loginsubmit){
//authenticate met post variabelen
} elseif ($sessie){
//authenticeer met encrypted sessievariabelen
} elseif ($cookie {
//authenticeer met encrypted cookievariabelen
}
?>

op deze manier worden je login gegevens namelijk 1 keer unencrypted verstuurd en toch iedere keer gecontroleerd(dus wachtwoordchange op machine 1 zorgt dat op machine 2 sessie verbroken word en opnieuw moet worden ingelogd)
Ook zou ik nog een validatie doen op de loginnaam en wachtwoord en nooit direct in een querie stoppen, dit om SQL injecties te voorkomen.

just my 2 cents.

if you pay peanuts, you get monkeys


Acties:
  • 0 Henk 'm!

  • Bram77
  • Registratie: September 2004
  • Laatst online: 10-07-2023
Is een htmlspesialchars() voldoende ter controle om SQL injecties te voorkomen? Of adviseer je een andere manier?

Acties:
  • 0 Henk 'm!

  • liledevil
  • Registratie: Oktober 2002
  • Laatst online: 15-01-2024

liledevil

DELL EVIL I

Bram77 schreef op vrijdag 03 november 2006 @ 14:24:
Is een htmlspesialchars() voldoende ter controle om SQL injecties te voorkomen? Of adviseer je een andere manier?
Dit is een minimale, maar vaak al zeer effectieve manier.
Het belangrijkste element in sql-injection is namelijk het gebruik van quotes, single en double, en deze haal je er met htmlspecialchars uit.
zelf laat ik meestal ook wat extra karakters zoals spaties eruit filteren. Laat deze ook al niet toe tijdens het creeeren van accounts. 8)

if you pay peanuts, you get monkeys


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Bram77 schreef op vrijdag 03 november 2006 @ 14:24:
Is een htmlspesialchars() voldoende ter controle om SQL injecties te voorkomen? Of adviseer je een andere manier?
Voor SQL injection bestaat er mysql_real_escape_string.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Dit is voornamelijk een implementatieprobleem en heeft dus niets met Software Engineering & Architecture te maken. Zie ook Waar hoort mijn topic? :)

SEA>>PRG

[ Voor 3% gewijzigd door NMe op 03-11-2006 14:40 ]

'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!

  • Jerry
  • Registratie: September 2001
  • Laatst online: 09-04-2022

Jerry

Who?

MadMurdock schreef op vrijdag 03 november 2006 @ 11:06:
Wat je zou kunnen doen om je huidige systeem uit te breiden is het volgende:

Op het moment dat een gebruiker inlogt (dus wanneer jij een nieuwe sessie start), dan maak je ook een cookie aan. In dit cookie zet je een uniek ID. In een database sla je dit ID ook op, en koppel je het eventueel aan een IP-adres.

Wanneer een gebruiker nu terugkomt (er is dus nog geen actieve sessie), dan controleer je eerst of zijn cookie met het ID nog bestaat, zo ja, controleer je of dat ID ook nog in jouw database zit en of het IP-adres wat daarbij staat ook nu weer klopt met dat van de gebruiken.

Als dat allemaal goed is, dan start je gewoon je normale session weer.

Dit kan je eventueel nog uitbreiden met md5-hashes, mogelijkheid om bepaalde sessies uit te loggen, challenge-response enzenzenz..
Hoe werkt het dan met dynamische ip-adressen? Want als iemand niet hetzelfde ip heeft dan moet die persoon alsnog opnieuw inloggen.

Specs
Youtube celebrity
D3 Crusader


Acties:
  • 0 Henk 'm!

  • MadMurdock
  • Registratie: Oktober 2000
  • Niet online
Jerry schreef op vrijdag 03 november 2006 @ 16:35:
[...]
Hoe werkt het dan met dynamische ip-adressen? Want als iemand niet hetzelfde ip heeft dan moet die persoon alsnog opnieuw inloggen.
Dat is inderdaad de consequentie. Daarom zie je vaak ook de optie om aan te geven of je de sessie wilt koppelen aan je IP-adres. Persoonlijk heb ik alleen het idee dat als je mensen die optie geeft, de meeste het nut ervan niet zullen zien en het niet zullen gebruiken.
Ik zou er dus gewoon voor kiezen om het standaard te implementeren om zo het risico op 'sessie-stelen' te verkleinen. Jammer voor de dynamische-IP/proxy-gebruikers, maar die maken toch een steeds kleiner deel uit van de gebruikersgroep.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Jerry schreef op vrijdag 03 november 2006 @ 16:35:
[...]


Hoe werkt het dan met dynamische ip-adressen? Want als iemand niet hetzelfde ip heeft dan moet die persoon alsnog opnieuw inloggen.
Dan moet diegene niet aanvinken dat ie op ip adres lockt dus ;) Dit staat standaard uit.

Ik heb ook een eigen session handler gemaakt waar je op meerdere locaties tegelijk kunt inloggen. Als je kiest ingelogd te blijven dan geef je je cookie een levensduur mee, anders niet (destroy na sluiten browser). Net als hier met React kun je locatienaam aangeven en in een CMS bijhouden welke sessie je waar hebt en wanneer die aangemaakt is/laatst gebruikt is/locatie ed. Succes! :)

Acties:
  • 0 Henk 'm!

  • Mr. Bondt
  • Registratie: Februari 2005
  • Laatst online: 10-06 10:11
Jerry schreef op vrijdag 03 november 2006 @ 16:35:
[...]


Hoe werkt het dan met dynamische ip-adressen? Want als iemand niet hetzelfde ip heeft dan moet die persoon alsnog opnieuw inloggen.
In plaats van het IP-adres zou je ook de client info op kunnen slaan.

Acties:
  • 0 Henk 'm!

  • Jerry
  • Registratie: September 2001
  • Laatst online: 09-04-2022

Jerry

Who?

Bedankt voor de tips :).

Specs
Youtube celebrity
D3 Crusader

Pagina: 1