Login onthouden

Gestart doorEleky24 reacties102 weergaven

25 berichten · pagina 1 van 2

Eleky

Lid · Topicstarter

Berichten
3.788
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Hallo,

Veel mensen zullen het, net als ik, ongelofelijk irritant vinden om constant weer opnieuw te moeten inloggen. Bij een ledensysteem is het zo dat de login informatie opslaat in een sessie, het nadeel hieraan is dat deze verloren gaan in de verloop van tijd.
Nu is dit probleem simpel te verhelpen door het login in systeem volledig op Cookies te laten draaien, maar dan nog is het niet geweldig.

Daarom gaan we nu een systeem maken dat makkelijk bij elk bestaand systeem in te zetten is, en ervoor zorgt de de login onthouden word, en meteen multiple logins delete (dus dat je op meerdere PCs op hetzelfde account zit).
LET OP!! Ik ga er bij dit script vanuit dat je huidige inlogsysteem het id van de gebruiker opslaat in een session! Zoniet zal dit niet werken

1. Hoe werkt het
Wat we gaan doen is een extra tabel maken in de database, de tabel logins. Deze tabel zou de logins onthouden. Deze tabel heeft 4 waardes: id, user, code en ip
Als je inlogd word er een code gemaakt, en deze word samen met het ip en het id van de gebruiker (als user) in de database gezet.
Vervolgens word deze code onthouden door een Cookie, en als je nu opnieuw naar de pagina gaat zal het systeem zien dat er een cookie bestaat, controleren of deze sessie nog loopt, zoja zichzelf inloggen en alle andere sessies met dezelfde gebruiker uitschakelen.

2. De Database
Ten eerste gaan we een database aanmaken voor ons systeem.
De code hiervoor heb ik al, gewoon copy paste:

CREATE TABLE IF NOT EXISTS `logins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` int(11) NOT NULL,
  `code` varchar(32) NOT NULL,
  `ip` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Deze tabel is de basis van ons systeem

3. Inloggen
Bij het inloggen moeten er nu dus 2 extra dingen gebeuren:
- Er moet een lijn in de database gezet worden
- Er moet een cookie aangemaakt worden
We beginnen gewoon bij het begin, een rij in de database zetten.
Hiervoor hebben we de user nodig, het ip en een code.
Dus beginnen met deze waardes:

[COLOR= #0000BB]<?php
$user[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]5[/COLOR][COLOR= #007700];[/COLOR] [COLOR= #FF8000]//Vervang 5 door een waarde van het id van de user[/COLOR]
[COLOR= #0000BB]$code[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/md5"]md5[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/microtime"]microtime[/URL][COLOR= #007700]());[/COLOR]
?>


Omdat het IP makkelijk op te halen is word die niet van tevoren gedefinieerd.
Wat hier nu gebeurt:
- $user = 5; | Hier geven we het ID van de gebruiker door, dsu het ID die in de database staat bij je leden tabel. Vervang dus de 5 door een variabele met het id
- $code = md5(microtime()); | Hier halen we eerst de microtime op, zodat alle codes uniek zijn, een dubbele code in microtime is zo goed als niet mogelijk. Dan maken we er een md5 hash van, zodat we een mooie code krijgen.

Hierna zetten we dit in de database, gewoon met een normale query:

[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"INSERT INTO logins (user, code, ip) VALUES("[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$user[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000]", "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$code[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000]", "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$_SERVER[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]REMOTE_ADDR[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]")"[/COLOR][COLOR= #007700]);[/COLOR]
?>


Als laatste maken we een cookie aan, zodat alles onthouden word:

[COLOR= #0000BB]<?php
$dagen[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]350[/COLOR][COLOR= #007700];[/COLOR] [COLOR= #FF8000]// Aantal dagen dat je ingelogd blijft[/COLOR]
[URL="http://www.php.net/setcookie"]setcookie[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$code[/COLOR][COLOR= #007700],[/COLOR] [URL="http://www.php.net/time"]time[/URL][COLOR= #007700]()+[/COLOR][COLOR= #0000BB]60[/COLOR][COLOR= #007700]*[/COLOR][COLOR= #0000BB]60[/COLOR][COLOR= #007700]*[/COLOR][COLOR= #0000BB]24[/COLOR][COLOR= #007700]*[/COLOR][COLOR= #0000BB]$dagen[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]/[/COLOR][COLOR= #007700]);[/COLOR]
?>


Eerst geven we hier het aantal dagen aan dat je ingelogd blijft, je kan dit bijv. op 9999 zetten voor een waarde die nagenoeg voor altijd betekent, maar ik gebruik hier 350 voor ongeveer een jaar
Dan maken we een cookie aan, usercode, die de code opslaat.

Het totale inloggedeelte word dan dus:

[COLOR= #0000BB]<?php
$user[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]5[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #0000BB]$dagen[/COLOR] [COLOR= #007700]=[/COLOR] [COLOR= #0000BB]350[/COLOR][COLOR= #007700];[/COLOR]
[COLOR= #0000BB]$code[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/md5"]md5[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/microtime"]microtime[/URL][COLOR= #007700]());[/COLOR]
[URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"INSERT INTO logins (user, code, ip) VALUES("[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$user[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000]", "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$code[/COLOR][COLOR= #007700].[/COLOR][COLOR= #DD0000]", "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$_SERVER[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]REMOTE_ADDR[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]")"[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/setcookie"]setcookie[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #0000BB]$code[/COLOR][COLOR= #007700],[/COLOR] [URL="http://www.php.net/time"]time[/URL][COLOR= #007700]()+[/COLOR][COLOR= #0000BB]60[/COLOR][COLOR= #007700]*[/COLOR][COLOR= #0000BB]60[/COLOR][COLOR= #007700]*[/COLOR][COLOR= #0000BB]24[/COLOR][COLOR= #007700]*[/COLOR][COLOR= #0000BB]$dagen[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000]/[/COLOR][COLOR= #007700]);[/COLOR]
?>


Door dit simpel bij je code voor inloggen te plakken werkt het al!

4. Controle
Nu word je dus ingelogd, echter word je nu nog niet goed onthouden.
Als je nu weer op de pagina komt ben je gewoon uitgelogd, er moet nog automatisch worden ingelogd.
Dit doen we met een code die ik niet helemaal met jullie ga bespreken, maar er alsvolgd uitziet:

LET OP!! verander login bij de sessie in de naam van jouw sessie waarin het id van de gebruiker word onthouden!

[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/session_start"]session_start[/URL][COLOR= #007700]();[/COLOR]
[URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/isset"]isset[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_COOKIE[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700]]) ||[/COLOR] [URL="http://www.php.net/isset"]isset[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_SESSION[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]login[/COLOR][COLOR= #007700]])){[/COLOR]
    [URL="http://www.php.net/if"]if[/URL][COLOR= #007700](![/COLOR][URL="http://www.php.net/isset"]isset[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_COOKIE[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700]])){[/COLOR]
        [COLOR= #FF8000]//Zet hier een code neer die redirect naar je uitloggen[/COLOR]
    [COLOR= #007700]}[/COLOR]
    [URL="http://www.php.net/elseif"]elseif[/URL][COLOR= #007700](![/COLOR][URL="http://www.php.net/isset"]isset[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_SESSION[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]login[/COLOR][COLOR= #007700]])){[/COLOR]
        [COLOR= #0000BB]$UserQuery[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"SELECT user FROM logins WHERE code = "[/COLOR][COLOR= #007700].[/COLOR][URL="http://www.php.net/mysql_real_escape_string"]mysql_real_escape_string[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_COOKIE[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700]]).[/COLOR][COLOR= #DD0000]" AND ip = "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$_SERVER[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]REMOTE_ADDR[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]""[/COLOR][COLOR= #007700]);[/COLOR]
        [URL="http://www.php.net/if"]if[/URL][COLOR= #007700]([/COLOR][URL="http://www.php.net/mysql_num_rows"]mysql_num_rows[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$UserQuery[/COLOR][COLOR= #007700]) !=[/COLOR] [COLOR= #0000BB]1[/COLOR][COLOR= #007700]){[/COLOR]
            [COLOR= #FF8000]//Ook hier een code die redirect naar uitloggen[/COLOR]
        [COLOR= #007700]}[/COLOR]
        [URL="http://www.php.net/else"]else[/URL][COLOR= #007700]{[/COLOR]
            [COLOR= #0000BB]$UserFetch[/COLOR] [COLOR= #007700]=[/COLOR] [URL="http://www.php.net/mysql_fetch_assoc"]mysql_fetch_assoc[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$UserQuery[/COLOR][COLOR= #007700]);[/COLOR]
            [COLOR= #0000BB]$_SESSION[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]login[/COLOR][COLOR= #007700]] =[/COLOR] [COLOR= #0000BB]$UserFetch[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]user[/COLOR][COLOR= #007700]];[/COLOR]
            [URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"DELETE FROM logins WHERE user = "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$_SESSION[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]login[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]" AND code != "[/COLOR][COLOR= #007700].[/COLOR][URL="http://www.php.net/mysql_real_escape_string"]mysql_real_escape_string[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_COOKIE[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700]]).[/COLOR][COLOR= #DD0000]""[/COLOR][COLOR= #007700]);
        }
    }[/COLOR]
    [URL="http://www.php.net/else"]else[/URL][COLOR= #007700]{[/COLOR]
        [URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"DELETE FROM logins WHERE user = "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$_SESSION[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]login[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]" AND code != "[/COLOR][COLOR= #007700].[/COLOR][URL="http://www.php.net/mysql_real_escape_string"]mysql_real_escape_string[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_COOKIE[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700]]).[/COLOR][COLOR= #DD0000]""[/COLOR][COLOR= #007700]);
    }
}[/COLOR]
?>


In het kort wat hier gebeurd:
- Eerst controleren we of de Cooke of Session bestaat (of allebei), indien zo gaan we verder
- Als alleen de session bestaat word je uitgelogd: er is dan dus iets niet goed gegaan (vervang de code naar je pagina voor uitloggen!)
- Als alleen de cookie bestaat gaat hij controleren of de code en ip matchen met een rij in de tabel
- Zoja maakt hij een session aan, en verwijderd hij alle andere sessies van deze gebruiker
- Zonee logt hij je uit, je hebt een foutieve sessie
- Als de sessie en de cookie bestaan verwijderd hij alleen alle sessies van deze gebruiker

Zet deze code in een bestand dat op elke pagina voorkomt, je header bestand, en alles word keurig bij gehouden en je word ingelogd bij elk bezoek!

5. Uitloggen
Bij het uitloggen moet er nu iets meer gebeuren dan eerst.
Teneerste moet de Cookie verwijderd worden, en ook de sessie in de database:

[COLOR= #0000BB]<?php[/COLOR]
[URL="http://www.php.net/mysql_query"]mysql_query[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]"DELETE FROM logins WHERE code = "[/COLOR][COLOR= #007700].[/COLOR][URL="http://www.php.net/mysql_real_escape_string"]mysql_real_escape_string[/URL][COLOR= #007700]([/COLOR][COLOR= #0000BB]$_COOKIE[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700]]).[/COLOR][COLOR= #DD0000]" AND ip = "[/COLOR][COLOR= #007700].[/COLOR][COLOR= #0000BB]$_SERVER[/COLOR][COLOR= #007700][[/COLOR][COLOR= #DD0000]REMOTE_ADDR[/COLOR][COLOR= #007700]].[/COLOR][COLOR= #DD0000]""[/COLOR][COLOR= #007700]);[/COLOR]
[URL="http://www.php.net/setcookie"]setcookie[/URL][COLOR= #007700]([/COLOR][COLOR= #DD0000]usercode[/COLOR][COLOR= #007700],[/COLOR] [COLOR= #DD0000][/COLOR][COLOR= #007700],[/COLOR] [URL="http://www.php.net/time"]time[/URL][COLOR= #007700]()-[/COLOR][COLOR= #0000BB]3600[/COLOR][COLOR= #007700]);[/COLOR]
?>


Zet dit bij je loguit script en het systeem is compleet!

6. Nawoord
Hou in de gaten dat systeem echt de basis is, er zijn nog veel meer opties hiervoor. Het kan bijvoorbeeld nog strakker werken, zodat zelfs alleen de sessie genoeg is, maar dit is niet altijd betrouwbaar.
Probeer vooral of je dit nog iets verder kan uitbreiden, en maak het je eigen

Ciaa
0
Fass

Lid

Berichten
3.771
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Kan dit niet ook zonder cookie, dat hij het ip in de db bewaart?
0
Eleky

Lid · Topicstarter

Berichten
3.788
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Fassdfds schreef:
Kan dit niet ook zonder cookie, dat hij het ip in de db bewaart?
Is mogelijk, maar dan kan je ook vanaf een andere PC met hetzelfde IP erop, wat nu niet mogelijk is!
0
Fass

Lid

Berichten
3.771
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Ohja. Alleen ik dacht dat er iets was dat cookies verboden gingen worden in Nederland ofzo?
Spoiler tonen
Ik heb de bel horen luiden, maar weet niet precies waar de klepel hangt.. xD
0
Eleky

Lid · Topicstarter

Berichten
3.788
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Fassdfds schreef:
Ohja. Alleen ik dacht dat er iets was dat cookies verboden gingen worden in Nederland ofzo?
Spoiler tonen
Ik heb de bel horen luiden, maar weet niet precies waar de klepel hangt.. xD
Het word niet verboden, er gaat alleen iets tegen gedaan worden, wat precies is nog niet bekent.
Het word iets met dat je een melding krijgt als een site een cookie wil aanmaken, en dat hij daar zo toestemming voor moet geven. Maar ik weet het ook niet precies
0
Fass

Lid

Berichten
3.771
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Wat zou dan een goede methode zijn om alleen op één specifieke computer ingelogd te blijven, maar zonder cookies? Ik kan niks meer bedenken..
0
Eleky

Lid · Topicstarter

Berichten
3.788
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Fassdfds schreef:
Wat zou dan een goede methode zijn om alleen op één specifieke computer ingelogd te blijven, maar zonder cookies? Ik kan niks meer bedenken..
Ik denk ook niet dat deze methode er is, of hij is vrij ingewikkeldwink
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Meestal kan het ook zijn doordat je link: http:// is i.p.v. http://www.
0
Eleky

Lid · Topicstarter

Berichten
3.788
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Shahiem schreef:
Meestal kan het ook zijn doordat je link: http:// is i.p.v. http://www.
Wat bedoel je daarmee?
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Bij mij login systeem had ik altijd dat als ik geen www. had, dat hij dan niet ingelogd blijft. Maar als ik er www. voor mijn url had gezet dan werkte hij wel.
0
Fass

Lid

Berichten
3.771
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Dan moet je de site sowieso laten doorlinken naar, www., dat probleem is niet lastig op te lossen >.<
0
Berichten
20.364
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Inderdaad, gewoon een 301 redirect.
0
Berichten
3.037
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
www. Subdomein kan ook, dan redirect je hem naar je normale website.
0
Eleky

Lid · Topicstarter

Berichten
3.788
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
Shahiem schreef:
Bij mij login systeem had ik altijd dat als ik geen www. had, dat hij dan niet ingelogd blijft. Maar als ik er www. voor mijn url had gezet dan werkte hij wel.
Maar dat heeft niks met dit probleem te makenwinkDit gaat om langere tijd onthouden, dus enkele dagen!
0
Berichten
8.602
Reputatie
0
Punten
0,00
Lid sinds
Laatst gezien
En als 2 gebruikers toevallig dezelfde code hebben door de microtime?
0

Jouw reactie

Deel je idee, stel een vraag of help een ander verder.

Editor laden…

Praat mee met de One2xs-community.

Inloggen om te reageren