Inleiding:
Met dit script kun je members met een gebruikersnaam en wachtwoord (afhankelijk
van het 'gebruikersniveau' of user level) toegang geven tot bepaalde delen van
je website, en anderen de toegang ontzeggen. Met behulp van een sessie (sessie-
variabelen) bepalen we tot welke delen van de website gebruikers toegang
hebben.
HOE je gebruikers deze rechten geeft en wat deze rechten inhouden is een ander
verhaal. Dit script beschrijft alleen het beveiligingsmechanisme.
Vereisten / aannames:
* De webmaster heeft de beschikking over een MySQL database waarin onder andere
gebruikersnaam, (versleuteld) wachtwoord en gebruikersniveau staan.
LET EROP dat het veld 'pass' tenminste 32 karakters lang dient te zijn, in
verband met gehashde passwords.
* sessies moeten ondersteund worden door de webserver
* Enige kennis van sessies, php functies (trim, md5, strcmp), binair tellen
(bitwise comparator)
Dit script is door mij al enige tijd in gebruik, en tot dusver heb ik nog geen
problemen ondervonden.
Mocht je echter problemen ondervinden (of gaten in de beveiliging ontdekken
die ik over het hoofd heb gezien ;)) mail of reply gerust.
Probeer (als iets niet werkt) eerst zelf uit te vogelen waarom iets niet werkt,
daar leer je echt het meeste van.
Lees ook eerst alles goed door; in de scripts zelf staat voldoende info om
vooruit te komen.
Bestanden:
- connect.php
In dit bestand wordt een connectie gemaakt naar je MySQL-databaseserver,
en selecteer je je eigen database.
- een login-script (login.php)
Hier type je je gebruikersnaam en wachtwoord in. In de database (of een file)
wordt gecontroleerd of je een bekende gebruiker bent. Als dit het geval is en
je wachtwoord klopt, worden enkele sessie-variabelen geïnitialiseerd en
ben je ingelogd. Vervolgens heb je toegang tot bepaalde member-only delen van
de site.
Hier kun je tevens aangeven of je login onthouden moet worden (op de machine
waar je mee inlogt).
Als je dit wilt, zal er een cookie worden aangemaakt en wordt in de database
bijgehouden onder welk IP-nummer je bent ingelogd. Het onthouden van je login
zal dus NIET werken op machines die een dynamisch (internet-)IP-nummer hebben.
Mijn script is zo gemaakt, dat wanneer je een bepaalde tijd niets
uitvoert, je op een gegeven moment weer uitgelogd bent (timeout) - deze "idle
time" kun je naar eigen smaak aanpassen.
- een logout-script (logout.php)
Hier wordt je sessie gedestroyed en wordt het sessie array leeggemaakt;
oftewel alle sessie gegevens worden verwijderd.
Wanneer er een cookie was geset die je login onthield, word deze hier
gecleared.
- een sessie-script (session.php)
Dit script dien je overal te includen waar je je pagina wilt beveiligen
(dus include("session.php"); of require("session.php"); - zie ook
voorbeeld.php) In deze include wordt gekeken of je idle-time is overschreden
en naar aanleiding daarvan worden acties uitgevoerd.
Als je nog niet bent ingelogd, maar bij een eerder bezoek hebt aangegeven dat
je login onthouden moest worden (en wanneer je nog steeds hetzelfde IP-nummer
als toen had) zal je sessie automatisch opnieuw opgestart te worden - je
wordt dan automatisch ingelogd.
- een voorbeeld-pagina (voorbeeld.php)
Hier worden (afhankelijk van het gebruikersniveau van een ingelogd persoon)
bepaalde delen van een pagina al dan niet zichtbaar gemaakt.
MySQL database tabel:
CREATE TABLE users (
id int(4) NOT NULL auto_increment,
name varchar(20) BINARY NOT NULL default '',
pass varchar(32) BINARY NOT NULL default '',
level int(10) NOT NULL default '0',
# v1.2 extra functionaliteit voor ingelogd blijven (volgende regel)
last_ip varchar(15) default NULL,
UNIQUE KEY id (id)
) TYPE=MyISAM;
CREATE TABLE users (
id int(4) NOT NULL auto_increment,
name varchar(20) BINARY NOT NULL default '',
pass varchar(32) BINARY NOT NULL default '',
level int(10) NOT NULL default '0',
# v1.2 extra functionaliteit voor ingelogd blijven (volgende regel)
last_ip varchar(15) default NULL,
) TYPE=MyISAM;
Uitbreiding:
Vanaf versie 1.2 is het mogelijk om je login te 'onthouden' door middel van het
setten van een cookie. Hierin staan de username en het encrypted wachtwoord van
een gebruiker opgeslagen. Om ervoor te zorgen dat mensen niet met een gestolen
cookie in kunnen loggen met de gegevens uit het cookie, wordt in de database
het IP bijgehouden van de machine van de persoon die het laatst succesvol is
ingelogd.
In de verschillende pagina's van het script zal aangegeven worden welke dingen
je moet toevoegen voor de gebruikmaking van deze extra functionaliteit.