Sessies nader bekeken: een eerste loginscript
In het vorige hoofdstuk hebben we een uitleg van het gebruik van superglobals in PHP gezien. Ook hebben we daar kennis gemaakt met de $_SESSION superglobal waarmee we variabele op meerdere paginas beschikbaar konden maken.
We zullen nu kijken naar hoe we deze manier kunnen toepassen in een zeer eenvoudig loginscript. Het script dat we schrijven is een loginscript voor 1 gebruiker met wachtwoord en zal gebruik maken van sessies.
De HTML code
Laten we maar weer beginnen met de HTML code van het loginformulier. We hebben nu twee inputvelden nodig waarin we een gebruikersnaam en wachtwoord in kunnen vullen. De typen die we voor deze velden gebruiken zijn respectievelijk 'text' en 'password'.
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Mijn eerste loginscript!</title>
</head>
<body>
<h1>Inloggen</h1>
<form method="post" action="login.php">
<p>
<label for="user">Gebruikersnaam:</label>
<input type="text" name="user" id="users" />
</p>
<p>
<label for="pass">Wachtwoord:</label>
<input type="password" name="pass" id="pass" />
</p>
<p>
<input type="submit" value="Inloggen" />
</p>
</form>
</body>
</html>
Deze code spreekt redelijk voor zich. De action van het formulier laten we verwijzen naar login.php, het script waarmee we het login formulier verwerken.
Hier kun je een werkend voorbeeld van het loginscript vinden.
Het PHP script
Ook nu zal ik eerst weer het hele script laten zien, waarna ik het stap voor stap met je zal doornemen.
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
46
47
48
49
50
include '../../inc/stats.php';
// We gaan sessies gebruiken
session_start();
// Gebruikersnaam en wachtwoord instellen
$sGebruikerControle = 'admin';
$sWachtwoordControle = 'voorbeeld';
// Controle of het formulier verzonden is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Controle of benodigde velden wel ingevuld zijn
if(isset($_POST['user'], $_POST['pass']))
{
// Overbodige spaties verwijderen
$sGebruiker = trim($_POST['user']);
$sWachtwoord = trim($_POST['pass']);
// Gebruikersnaam en wachtwoord controleren
if($sGebruiker == $sGebruikerControle && $sWachtwoord == $sWachtwoordControle)
{
// Juiste gebruikersnaam en wachtwoord: inloggen!
$_SESSION['logged_in'] = true;
$_SESSION['gebruiker'] = $sGebruiker;
// Doorsturen en melding geven
header('Refresh: 3; url=beveiligd.php');
echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
}
else
{
// Terugsturen en foutmelding geven
header('Refresh: 3; url=login_form.php');
echo 'Deze combinatie van gebruikersnaam en wachtwoord is niet juist!';
}
}
else
{
header('Refresh: 3; url=login_form.php');
echo 'Een vereist veld bestaat niet!';
}
}
else
{
// Terug naar het formulier
header('Location: login_form.php');
exit();
}
?>
Zoals je ziet lijkt het redelijk veel op de afhandeling van een formulier die we eerder al toegepast hebben. In dit script zitten echter wel een aantal andere dingen.
2
3
4
5
6
7
8
// We gaan sessies gebruiken
session_start();
// Gebruikersnaam en wachtwoord instellen
$sGebruikerControle = 'admin';
$sWachtwoordControle = 'voorbeeld';
?>
We maken bij dit loginscript gebruik van sessievariabelen, dus moeten we de pagina met session_start() beginnen. Vervolgens declareren we twee variabelen die respectievelijk de gebruikersnaam en het wachtwoord bevatten, deze zullen we later voor de controle gebruiken.
In geavanceerdere loginscripts haal je de gebruikersnaam en wachtwoord voor controle vaak uit een database. Maar aangezien database verbindingen geen onderdeel van deze tutorial zijn, zal ik dat hier niet behandelen.
2
3
4
// Controle of het formulier verzonden is
if($_SERVER['REQUEST_METHOD'] == 'POST')
?>
Ook hier controleren we eerst of er wel een formulier gepost is. We kunnen immers alleen met $_POST variabelen werken als ze ook daadwerkelijk gevuld en dus verzonden zijn.
De controle of de benodigde velden wel in de $_POST array aanwezig zijn, kan hier natuurlijk ook niet ontbreken.
Vervolgens gebruiken we trim() om de loze spaties voor of achter een input te verwijderen. Dit voorkomt dat de gebruikersnaam en wachtwoord niet overeen zouden komen door zo'n spatie.
2
3
4
5
6
7
8
9
10
11
12
if($sGebruiker == $sGebruikerControle && $sWachtwoord == $sWachtwoordControle)
{
// Juiste gebruikersnaam en wachtwoord: inloggen!
$_SESSION['logged_in'] = true;
$_SESSION['gebruiker'] = $sGebruiker;
// Doorsturen en melding geven
header('Refresh: 3; url=beveiligd.php');
echo 'Je bent succesvol ingelogd. Je wordt doorgestuurd.';
}
?>
Dit is het gedeelte waar het eigenlijk om draait. Allereerst controleren we of de ingevulde gebruikersnaam en wachtwoord overeenkomen met de ingestelde waarden. Als dat het geval is, declareren we een tweetal sessievariabelen. $_SESSION['logged_in'] is een boolean die aangeeft of een gebruiker ingelogd is, $_SESSION['gebruiker'] krijgt de gebruikersnaam van de ingelogde gebruiker.
Opmerking: wachtwoorden sla je nooit op in een sessievariabele of cookie. Dit is nergens voor nodig en bovendien onveilig aangezien ook sessies gestolen kunnen worden. Een wachtwoord heb je maar eenmalig nodig, en dat is bij de controle van het login formulier.
Tenslotte geven we een melding dat de gebruiker ingelogd is en sturen we de gebruiker door naar de volgende pagina.
Als de gebruikersnamen en/of het wachtwoord niet overeenkomen, geven we daar een melding van en sturen we de gebruiker terug naar het login formulier.
De beveiligde pagina
Tot nu toe hebben we gezien hoe we het login formulier in HTML weergeven en hoe de verwerking van het login formulier eruit ziet. Dan kunnen we nu kijken naar de beveiligde paginas die alleen toegankelijk zijn voor ingelogde gebruikers.
Op deze beveiligde paginas controleren we helemaal aan het begin met een if-statement of de bezoeker wel ingelogd is. Als dat niet het geval is, sturen we hem direct door naar het login formulier en stoppen we de rest van de uitvoer van het script.
2
3
4
5
6
7
8
9
10
11
12
13
14
// We werken ook hier met sessies
session_start();
// Controleren of de bezoeker ingelogd is
if(!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] == false)
{
header('Location: login_form.php');
exit();
}
// Een welkomst tekst weergeven
echo 'Welkom '.$_SESSION['gebruiker'].' wat leuk dat je er weer bent.';
?>
Allereerst beginnen we deze pagina ook weer met session_start(), we werken immers weer met sessievariabelen. Vervolgens controleren we of de variabele $_SESSION['logged_in'] bestaat en of de waarde van deze variabele niet gelijk is aan FALSE.
Als een van deze voorwaarden wel het geval is, sturen we de gebruiker met een header() direct door naar het login formulier en gebruiken we exit() om de verdere uitvoer van het script te stoppen.
Mocht de bezoeker wel ingelogd zijn, dan wordt niet voldaan aan het if-statement en wordt de rest van het script uitgevoerd. In ons geval houdt dat het geven van een welkomstbericht in. In dat bericht gebruiken we $_SESSION['gebruiker'] om de ingelogde gebruiker persoonlijk aan te spreken.
Op elke pagina waarop je enkel ingelogde gebruikers toegang wilt geven, plaats je dus regel 1-10 uit dit voorbeeld boven aan het script. Op die manier heb je altijd de zekerheid dat de pagina alleen aan ingelogde gebruikers getoond wordt.
Hier kun je een werkend voorbeeld van het loginscript vinden. De gebruikersnaam en wachtwoord zijn, zoals je in het script kunt zien, admin en voorbeeld.
Inhoudsopgave
- Inleiding
- Mijn eerste PHP script
- Variabelen
- Statements
- Loops
- Arrays
- Functies
- Formulieren
- Superglobals
- Sessies nader bekeken: een eerste loginscript
- Netjes scripten
- Debuggen: het oplossen van PHP fouten
- Slotwoord en referenties