Hoi,
Een dik jaar geleden alweer, bokste ik een inlogscript met verschillende gebruikers niveaus in elkaar. Ik heb het origineel nooit gebackuped (stom van me), en wist er nu via een vriend (die het hier en daar wat had aangepast) terug te krijgen. Die aanpassingen zorgen ervoor dat het geheel niet meer werkt.
In de database beveiliging heb ik een tabel met velden gebruiker, wachtwoord en rechten. Het wachtwoord wordt md5-geëncrypteerd, de rechten kunnen 'administrator', 'beheerder' en 'gebruiker' zijn.
Als ik een pagina wil beveiligen, include ik dit (inc/inc_beveilig.php) bestandje bovenaan:
Praktijkvoorbeeld: het bestand 'schrijf_iets_naar_db.php' wil ik beveiligen; ik doe dan:
Zoals je ziet, wil het het script me - als ik niet ben ingelogd - naar index.php?pagina=login sturen. Dat werkt nog.
Het bestand 'login.php' - wat je voorgeschoteld krijgt als je index.php?pagina=login aanroept - ziet er zo uit:
Omdat een administrator ook alles wat een 'gewone' beheerder en gebruiker mag, werk ik met cijfertjes. Die zitten in het bestand inc/inc_rechten.php.
Ik krijg het loginformulier goed gepresenteerd, en kan ook daadwerkelijk inloggen. Het enige dat niet lijkt te werken, is het eigenlijke inloggen zelf. Om de een of andere reden steekt hij het nummertje van de rechten (dus 1 voor administrator, bijvoorbeeld) niet in een sessievariabele. Bovenaan index.php staat dit.
(Warnings staan af, dus hij gaat niet melken als die sessievariabele niet bestaat. Maar zelfs als ik 'succesvol' ben ingelogd, print hij niets.)
Wat zie ik hier over het hoofd?
Een dik jaar geleden alweer, bokste ik een inlogscript met verschillende gebruikers niveaus in elkaar. Ik heb het origineel nooit gebackuped (stom van me), en wist er nu via een vriend (die het hier en daar wat had aangepast) terug te krijgen. Die aanpassingen zorgen ervoor dat het geheel niet meer werkt.
In de database beveiliging heb ik een tabel met velden gebruiker, wachtwoord en rechten. Het wachtwoord wordt md5-geëncrypteerd, de rechten kunnen 'administrator', 'beheerder' en 'gebruiker' zijn.
Als ik een pagina wil beveiligen, include ik dit (inc/inc_beveilig.php) bestandje bovenaan:
PHP:
1
2
3
4
5
6
7
8
9
10
| <?php function beveilig($vereiste_rechten_voor_pagina){ $_SESSION['pagina'] = $_GET['pagina']; require_once("inc/inc_rechten.php"); $vereiste_rechten = $rechten[$vereiste_rechten_voor_pagina]; if(!isset($_SESSION['rechten']) || $_SESSION['rechten'] > $vereiste_rechten){ header("location: index.php?pagina=login"); } } ?> |
Praktijkvoorbeeld: het bestand 'schrijf_iets_naar_db.php' wil ik beveiligen; ik doe dan:
PHP:
1
2
3
| <?php beveilig("administrator"); ?> |
Zoals je ziet, wil het het script me - als ik niet ben ingelogd - naar index.php?pagina=login sturen. Dat werkt nog.
Het bestand 'login.php' - wat je voorgeschoteld krijgt als je index.php?pagina=login aanroept - ziet er zo uit:
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
| <?php mysql_select_db("beveiliging"); function verifieer($gebruiker, $wachtwoord){ $wachtwoord = md5($wachtwoord); $query_verifieer = "SELECT * FROM gebruiker WHERE gebruiker = \"$gebruiker\" AND wachtwoord = \"$wachtwoord\";"; echo($query_verifieer); $resultaat_verifieer = mysql_query($query_verifieer) or die(mysql_error()); if(mysql_num_rows($resultaat_verifieer) == 1){ return true; } } function login($gebruiker){ $query_login = "SELECT rechten FROM gebruiker WHERE gebruiker = \"$gebruiker\";"; echo($query_login); $resultaat_login = mysql_query($query_login) or die(mysql_error()); $rij_login = mysql_fetch_array($resultaat_login); include("inc/inc_rechten.php"); $_SESSION['rechten'] = $rechten[$rij_login['rechten']]; header("location: index.php?pagina=" . $_SESSION['pagina']); } ?> <?php if(!isset($_POST['login'])){ ?> <form name="form_login" method="post" action="index.php?pagina=login"> gebruiker: <input type="text" name="gebruiker" /> <br /> wachtwoord: <input type="password" name="wachtwoord" /> <br /> <input type="submit" name="login" value="login"> </form> <?php } else{ if(verifieer($_POST['gebruiker'], $_POST['wachtwoord'])){ login($_POST['gebruiker']); } else{ echo("<p>Inloggen mislukt.</p>"); //echo("<p>" . $_POST['wachtwoord'] . "</p>"); } } ?> |
Omdat een administrator ook alles wat een 'gewone' beheerder en gebruiker mag, werk ik met cijfertjes. Die zitten in het bestand inc/inc_rechten.php.
PHP:
1
2
3
4
5
| <?php $rechten["administrator"] = 1; $rechten["beheerder"] = 2; $rechten["gebruiker"] = 3; ?> |
Ik krijg het loginformulier goed gepresenteerd, en kan ook daadwerkelijk inloggen. Het enige dat niet lijkt te werken, is het eigenlijke inloggen zelf. Om de een of andere reden steekt hij het nummertje van de rechten (dus 1 voor administrator, bijvoorbeeld) niet in een sessievariabele. Bovenaan index.php staat dit.
PHP:
1
2
3
4
5
| <?php ob_start(); include("inc/inc_verbinding.php"); // MySQL-verbinding include("inc/inc_beveilig.php"); echo($_SESSION['rechten']); |
(Warnings staan af, dus hij gaat niet melken als die sessievariabele niet bestaat. Maar zelfs als ik 'succesvol' ben ingelogd, print hij niets.)
Wat zie ik hier over het hoofd?
[ Voor 1% gewijzigd door Verwijderd op 06-08-2006 17:45 . Reden: paar regels bij index.php bijgeplakt ]