login  Naam:   Wachtwoord: 
Registreer je!
 Scripts:

Scripts > PHP > Beveiliging > loginscript mbv sessies v1.2

loginscript mbv sessies v1.2

Auteur: Thomas - 27 augustus 2004 - 14:27 - Gekeurd door: Dennisvb - Hits: 61204 - Aantal punten: 4.23 (44 stemmen)




-----------------------------------------------------------------------
WAARSCHUWING - DIT SCRIPT IS VEROUDERD / NIET 100% VEILIG (MEER)
-----------------------------------------------------------------------
2014-10-29
Dit script (ondertussen meer dan 10 jaar oud!) valt eigenlijk in een aantal onderdelen uiteen, die eigenlijk afzonderlijk behandeld zouden moeten worden:

- communicatie met de database (database-laag)
- gebruikersbeheer (gebruikersbeheer/-backend)
- gebruik (en verwerking) van formulier(-data) (formuliersysteem)
- authenticatie van een gebruiker (authenticatie/beveiliging)
- rechtenbeheer van gebruikers (rechtenbeheer/-backend)
- het combineren van bestanden die samen een "pagina" vormen (templatesysteem of equivalent)

In dit script zijn er veel aannames gedaan over hoe je webpagina's in elkaar zitten, dit maakt het script waarschijnlijk minder geschikt om (naadloos) te integreren in je eigen code. Dit neemt niet weg dat je de principes kunt gebruiken om delen van je website af te schermen.

De crux van dit geheel is het gebruik van sessies. Sessies stellen je, net als cookies maar dan op een "veilige(re)" manier, in staat om informatie te onthouden tussen verschillende pagina's van een website. Een sessie kan dus bijvoorbeeld onthouden dat je op een zeker moment een juiste gebruikersnaam/wachtwoord-combinatie hebt ingevoerd die jou (hopelijk) identificeert als de bijbehorende gebruiker.

Een tweetal dingen uit het onderstaande script zou ik (structureel gezien) nou waarschijnlijk anders aanpakken:
1. de opslag van rechten/privileges in de sessie
Het script werkt zo dat de rechten die iemand heeft (hier $_SESSION['slevel']) opgeslagen worden in de sessie zelf.
Dit heeft zowel voor- als nadelen. Een voordeel is dat je niet elke page-access de rechten hoeft op te halen uit de database (dit scheelt dus een of meer queries). Een nadeel is dat deze rechten van kracht blijven zolang de sessie van
de gebruiker bestaat, ook al pas je ondertussen de rechten aan in de database. De enige manier om iemand zijn "sessie rechten" in te trekken is deze gebruiker geforceerd (via code of anderszins) uit te laten loggen. Een mogelijk beter
alternatief is dat je in je sessie geen rechten opslaat (maar enkel een gebruikers-id) maar dat je deze rechten elke page-access opnieuw berekent en bijvoorbeeld opslaat in een user-object. De user-klasse zou je vervolgens kunnen voorzien van methoden waarmee je bepaalt of een gebruiker een bepaalde handeling mag verrichten. Hiermee bewerkstellig je waarschijnlijk een betere "scheiding van verantwoordelijkheden": je sessie onthoudt (enkel) wie je bent, met het (elke page-access opnieuw geconstrueerde) user object bepaald je verdere authenticatie-vraagstukken (if ($user->hasRights($array_met_te_controleren_verplichte_rechten)) { ... } o.i.d.).

2. het "doorloggen"
Indien in het onderstaande script de sessie is verlopen (door timeout of wat dan ook) en je hebt aangegeven dat je je login wilt onthouden, dan zal worden getracht om de sessie on-the-fly door te starten. Hierbij wordt de pagina wel ververst. Als je op dat moment dus bijvoorbeeld een lange post aan het schrijven was dan gaat deze informatie verloren. Het zou dus beter zijn om dus niet tussendoor te redirecten. Als je er voor zorgt dat de heropbouw van de sessie plaatsvindt voordat je bijvoorbeeld controleert of iemand toegang heeft tot een pagina (dus ook -als we voortborduren op het gebruik van een user class-
voordat we het user object opnieuw bouwen (wat op zijn beurt weer zijn informatie uit de sessie onttrekt)), dan zou deze doorstart geruisloos kunnen plaatsvinden.

Je kunt het onderstaande script wel gebruiken om enigszins vertrouwd te raken met de materie, maar echt veilig is deze niet meer. Wel zou dit script eenvoudig veilig(er) gemaakt kunnen worden, maar het is beter om een iets andere opzet te hanteren wanneer je dit soort functionaliteit wilt. Je zou daarvoor dit script in combinatie met bovenstaande notities als leidraad kunnen gebruiken om zelf iets te bouwen.

EINDE WAARSCHUWING / EXTRA NOTITIES
-----------------------------------------------------------------------

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:
  1. CREATE TABLE users (
  2. id int(4) NOT NULL auto_increment,
  3. name varchar(20) BINARY NOT NULL default '',
  4. pass varchar(32) BINARY NOT NULL default '',
  5. level int(10) NOT NULL default '0',
  6. # v1.2 extra functionaliteit voor ingelogd blijven (volgende regel)
  7. last_ip varchar(15) default NULL,
  8. UNIQUE KEY id (id)
  9. ) 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.

Code:
aanmeld.php
  1. <?php
  2. require("connect.php"); // verbinding met de database maken
  3. ?>
  4. <html>
  5. <head>
  6. <title>sessies · aanmelden</title>
  7. </head>
  8.  
  9. <body>
  10. <?php
  11. // als het formulier nog niet is ingevuld
  12. if(!isset($_POST['submit'])) {
  13. ?>
  14. <form action="aanmeld.php" method="post">
  15. naam <input type="text" name="naam" size="40" maxlength="20" /><br />
  16. wachtwoord <input type="password" name="wacht1" size="40" maxlength="30" /><br />
  17. wachtwoord opnieuw <input type="password" name="wacht2" size="40" maxlength="30" /><br />
  18. <!--
  19. en wat je verder over deze gebruiker bij wilt houden
  20. bijvoorbeeld leeftijd, woonplaats, email, ...
  21. voor het opvragen van het wachtwoord etc. etc.
  22. hier moet je dan ook velden voor in je tabel 'members' aanmaken.
  23. Op deze extra velden moeten hieronder ook controles uitgevoerd worden of ze ingevuld zijn!
  24. -->
  25. <input type="submit" name="submit" value="submit" />
  26. </form>
  27. <?php
  28. // formulier gepost, kijk of alle velden ook daadwerkelijk zijn ingevuld
  29. } elseif(trim($_POST['naam']) <> "" && trim($_POST['wacht1']) <> "") {
  30. // formulier ingevuld - kijk eerst of de gebruiker al bestaat
  31. $naam = $_POST['naam'];
  32. $res = mysql_query("SELECT * FROM users WHERE name='".$naam."'") or die(mysql_error());
  33. if(mysql_num_rows($res) == 0) {
  34. // geen resultaten - dit is wat we willen
  35. // kijk of de opgegeven wachtwoorden overeenkomen
  36. if(!strcmp($_POST['wacht1'], $_POST['wacht2'])) {
  37. // wachtwoorden komen overeen - sla alle gegevens op in de database
  38. // naam is al opgehaald uit het formulier
  39. $wacht = md5($_POST['wacht1']); // versleuteld wachtwoord
  40. $level = 1; // standaard gebruikersniveau
  41. mysql_query("INSERT INTO users (name, pass, level) VALUES ('".$naam."','".$wacht."',".$level.")") or die(mysql_error());
  42.  
  43. // geef melding weer
  44. ?>
  45. Je gegevens zijn opgeslagen.<br />
  46. Je kunt <a href="login.php">hier</a> naartoe om in te loggen.<br />
  47. <?php
  48. } else {
  49. // wachtwoorden komen niet overeen
  50. ?>
  51. De twee opgegeven wachtwoorden zijn niet hetzelfde.<br />
  52. Druk op de "back" knop van je browser en voer twee identieke wachtwoorden in.<br />
  53. <?php
  54. }
  55. } else {
  56. // er bestaat al een gebruiker met deze naam
  57. ?>
  58. Er bestaat al een gebruiker met deze naam.<br />
  59. Druk op de "back" knop van je browser en geef een andere naam op.<br />
  60. <?php
  61. }
  62. } else {
  63. // sommige velden zijn niet ingevuld
  64. ?>
  65. Alle velden dienen ingevuld te worden.<br />
  66. Druk op de "back" toets en vul in alle velden wat in.<br />
  67. <?php
  68. }
  69. ?>
  70. </body>
  71. </html>


connect.php
  1. <?php
  2. $host = ""; // je hostname, meestal localhost
  3. $user = ""; // je username
  4. $pass = ""; // je wachtwoord
  5. $dbas = ""; // je database-naam
  6.  
  7. // connect naar database
  8. if(mysql_connect($host, $user, $pass)) {
  9. // selecteer database
  10. } else {
  11. // connecten naar database is mislukt
  12. echo "Failed to connect to database.";
  13. }
  14. ?>


login.php
  1. <?php
  2. require("connect.php"); // connectie met database maken en database selecteren
  3. session_start(); // start een sessie of zet een sessie voort
  4.  
  5. // controleer hier of iemand inlogt - dit moet _voor_ de <HTML>-tag gebeuren gebeuren
  6. if(isset($_POST['login'])) {
  7. if(trim($_POST['naam']) <> "" && trim($_POST['wacht']) <> "") {
  8. // naam en wachtwoord zijn ingevuld. Haal het (versleutelde) wachtwoord en
  9. // het gebruikersniveau dat bij deze gebruikersnaam hoort uit de database op
  10. // en vergelijk dit wachtwoord met het in het formulier opgegeven wachtwoord.
  11.  
  12. $naam = $_POST['naam'];
  13. $wacht = md5($_POST['wacht']);
  14. $res = mysql_query("SELECT id, pass, level FROM users where name='".$naam."'") or die(mysql_error());
  15.  
  16. // Als er een resultaat is, oftewel er bestaat een gebruiker met de naam $naam
  17. if(mysql_num_rows($res) > 0) {
  18. $row = mysql_fetch_assoc($res);
  19. // aanname: het wachtwoord in de database is eenmalig gehashed mbv de functie md5()
  20. // vergelijk het opgehaalde wachtwoord met een versleutelde versie van het in het
  21. // formulier opgegeven wachtwoord
  22. if(!strcmp($wacht, $row['pass'])) {
  23. // alle gegevens kloppen
  24.  
  25. // v1.2 extra functionaliteit, onthouden login
  26. // wil de gebruiker zijn gegevens onthouden ?
  27. if(isset($_POST['memory'])) {
  28. // set cookie (voor 2 maanden) en onthoud het IP
  29. // gebruik hierbij het id van de gebruiker
  30. setcookie("login_cookie", $row['id'].";".$row['pass'], time()+3600*24*31*2, "/");
  31. $ip = $_SERVER['REMOTE_ADDR'];
  32. mysql_query("UPDATE users SET last_ip='".$ip."' WHERE id=".$row['id']) or die(mysql_error());
  33. }
  34.  
  35. // vul sessievariabelen
  36. $_SESSION['suser'] = $naam; // gebruikersnaam van ingelogd persoon
  37. $_SESSION['slevel'] = $row['level']; // bijbehorende gebruikersniveau
  38. $_SESSION['stime'] = time(); // de huidige tijd
  39. $_SESSION['smaxidle'] = 60 * 60; // het aantal seconden inactiviteit
  40. } else {
  41. // wachtwoorden komen niet overeen, breek de sessie weer af
  42. $_SESSION = array();
  43. }
  44. // geef de resultaten van deze query weer vrij
  45. unset($row);
  46. }
  47. // ververs, of de gebruikersnaam/wachtwoord combinatie nou klopt of niet, de pagina
  48. header("Location: login.php");
  49. }
  50. }
  51. ?>
  52. <html>
  53. <head>
  54. <title>sessies · login</title>
  55. </head>
  56.  
  57. <body>
  58. <?php
  59. // als de (een willekeurige) sessievariabele suser in het sessie-array nog geen waarde heeft
  60. // (dus als iemand nog niet is ingelogd)
  61. if(!isset($_SESSION['suser'])) {
  62. ?>
  63. <form action="login.php" method="post">
  64. naam <input type="text" name="naam" size="15"><br />
  65. wachtwoord <input type="password" name="wacht" size="15"><br />
  66. <!-- v1.2 extra functionaliteit, login onthouden -->
  67. <input type="checkbox" name="memory" value="1"> onthoud mijn login (gebruikt cookie)<br />
  68. <input type="submit" name="login" value="log in"><br />
  69. </form>
  70. <?php
  71. } else {
  72. // de gebruiker is ingelogd - geef een welkomstboodschap oid
  73. // hier kun je tevens kijken of alle sessievariabelen de goede
  74. // waarden hebben (debugging)
  75. ?>
  76. Hi <b><?= $_SESSION['suser'] ?></b>,<br />
  77. <a href="voorbeeld.php">voorbeeld pagina</a><br />
  78. <a href="logout.php">uitloggen</a><br />
  79. <?php
  80. }
  81. ?>
  82. </body>
  83. </html>


logout.php
  1. <?php
  2. session_start(); // start een sessie of zet een sessie voort
  3. $_SESSION = array(); // maak het sessie array leeg
  4. session_destroy(); // verwijder de sessie
  5.  
  6. // als er een cookie geset is, reset deze
  7. if(isset($_COOKIE['login_cookie'])) {
  8. setcookie("login_cookie", "", time(), "/");
  9. }
  10. ?>
  11. <html>
  12. <head>
  13. <title>sessies · logout</title>
  14. </head>
  15.  
  16. <body>
  17. Uitgelogd.<br />
  18. <a href="voorbeeld.php">voorbeeld pagina</a><br />
  19. <a href="login.php">(opnieuw) inloggen</a><br />
  20. </body>
  21. </html>


session.php
  1. <?php
  2. session_start(); // start een sessie of zet een sessie voort
  3.  
  4. // als de gebruiker is ingelogd
  5. if(isset($_SESSION['suser'])) {
  6. // het volgende timeout deel is optioneel - dit mag worden weggelaten
  7. // * timeout gedeelte *
  8. $now = time();
  9. // als er meer tijd is verstreken dan smaxidle
  10. // sinds het aanmaken van de sessie
  11. if($now - $_SESSION['stime'] > $_SESSION['smaxidle']) {
  12. // breek de sessie af, de gebruiker dient opnieuw in te loggen
  13. $_SESSION = array();
  14. } else {
  15. // ververs anders de sessietijd. Dit zorgt er voor
  16. // dat de gebruiker ingelogd blijft zolang deze actief is.
  17. $_SESSION['stime'] = $now;
  18. }
  19. // * einde timeout gedeelte *
  20. // v1.2 extra functionaliteit, onthouden login
  21. } elseif(isset($_COOKIE['login_cookie'])) {
  22. // bekijk de waarden van de cookie en als deze kloppen met de database - start alsnog een sessie
  23. // aanname - er is een verbinding met de database
  24. list($id, $wacht) = split(";", $_COOKIE['login_cookie']);
  25. $res = mysql_query("SELECT id, pass, level, last_ip FROM users WHERE id='".$id."'") or die(mysql_error());
  26. if(mysql_num_rows($res) > 0) {
  27. $row = mysql_fetch_assoc($res);
  28. if(!strcmp($wacht, $row['pass']) && $_SERVER['REMOTE_ADDR'] == $row['last_ip']) {
  29. // init session
  30. $_SESSION['suser'] = $naam;
  31. $_SESSION['slevel'] = $row['level'];
  32. $_SESSION['stime'] = time();
  33. $_SESSION['smaxidle'] = 60 * 60;
  34.  
  35. // update cookie
  36. // gebruik hierbij wederom het id en het versleutelde wachtwoord
  37. setcookie("login_cookie", $id.";".$wacht, time()+3600*24*31*2, "/");
  38. } else {
  39. // password of ip komt niet overeen - unset het cookie en beeindig de sessie
  40. setcookie("login_cookie", "", time(), "/");
  41. $_SESSION = array();
  42. }
  43. // geef resultaten vrij
  44. unset($row);
  45. } else {
  46. // gebruiker onbekend, cookie vervalst ?
  47. $_SESSION = array();
  48. }
  49. // ververs de pagina
  50. header("Location: ".$_SERVER['REQUEST_URI']);
  51. }
  52. ?>


voorbeeld.php
  1. <?php
  2. // include/require hier evt nog andere zaken
  3. require ("connect.php");
  4. // we willen op deze pagina gebruik maken van beveiliging mbv sessies,
  5. // dus includen (requiren) we session.php
  6. require("session.php");
  7. ?>
  8. <html>
  9. <head>
  10. <title>sessies · voorbeeld</title>
  11. </head>
  12.  
  13. <body>
  14. <?php
  15. /*
  16. we gaan hier kijken of de gebruiker is ingelogd, en welk
  17. user level de gebruiker heeft. Op grond daarvan laten we
  18. bepaalde delen al dan niet zien.
  19. Een gebruikerslevel is een getal wat aangeeft hoeveel
  20. "macht" je hebt. Vaak is het zo: hoe hoger het getal, hoe
  21. meer je mag.
  22. bijvoorbeeld:
  23. Voor een bepaalde bewerking heb je gebruikers-
  24. niveau 1 nodig, maar voor een andere bewerking heb je niveau
  25. 2 nodig. Een gebruiker die beide bewerkingen mag uitvoeren
  26. heeft gebruikersniveau 1+2 = 3. MAAR: Een gebruiker die om
  27. een of andere reden alleen de tweede bewerking mag uitvoeren
  28. heeft gebruikersniveau 0+2 = 2. Dus je telt de nummers die
  29. bij bepaalde rechten horen bij elkaar op.
  30. Het nummer dat het recht geeft op een bepaalde bewerking is
  31. altijd een macht van 2.
  32. bijvoorbeeld:
  33. recht #1 (bv inloggen) heeft gebruikers niveau 2^0 = 1
  34. recht #2 (bv je eigen info veranderen) heeft gebr. niveau 2^1 = 2
  35. recht #3 (bv nieuws toevoegen) heeft gebruikers niveau 2^2 = 4
  36. recht #4 (bv members toevoegen) heeft gebruikersniveau 2^3 = 8
  37. enz.
  38. Iemand die al deze bewerkingen mag uitvoeren heeft dus
  39. gebruikersniveau 1+2+4+8 = 15 (of 2^4 - 1)
  40. Iemand die alleen recht #1 en recht #3 heeft, heeft
  41. dus gebruikersniveau 1+4 = 5
  42. */
  43. // controle op ingelogd zijn:
  44. if(isset($_SESSION['suser'])) {
  45. ?>
  46. user <b><?= $_SESSION['suser'] ?></b> is logged in.<br />
  47. <?php
  48. /*
  49.   vervolgens kijken we naar het userlevel, we vergelijken
  50.   bitsgewijs het gebruikerslevel - dit doen we met behulp van
  51.   een enkele '&' (de bitwise comparator)
  52.   *** LET OP ***
  53.   Enkel controleren met & is niet genoeg !
  54.   Stel dat je level 9 moet hebben voor een bepaalde bewerking, en je hebt
  55.   maar level 1. 1 & 9 is gelijk aan 1, en dan zou if(1 & 9) { ... } true opleveren
  56.   Je moet dus expliciet controleren of je level hoog genoeg is.
  57.   */
  58. if(($_SESSION['slevel'] & 1) == 1) {
  59. // voer code uit behorend bij recht #1
  60. ?>
  61. Je hebt recht #1.<br />
  62. <?php
  63. } else {
  64. // geef een melding dat je de acties
  65. // behorend bij recht #1 niet mag uitvoeren
  66. ?>
  67. Je hebt recht #1 NIET.<br />
  68. <?php
  69. }
  70.  
  71. if(($_SESSION['slevel'] & 2) == 2) {
  72. // voer code uit behorend bij recht #2
  73. ?>
  74. Je hebt recht #2.<br />
  75. <?php
  76. } else {
  77. ?>
  78. Je hebt recht #2 NIET.<br />
  79. <?php
  80. }
  81. if(($_SESSION['slevel'] & 4) == 4) {
  82. // voer code uit behorend bij recht #3
  83. ?>
  84. Je hebt recht #3.<br />
  85. <?php
  86. } else {
  87. ?>
  88. Je hebt recht #3 NIET.<br />
  89. <?php
  90. }
  91. if(($_SESSION['slevel'] & 8) == 8) {
  92. // voer code uit behorend bij recht #4
  93. ?>
  94. Je hebt recht #4.<br />
  95. <?php
  96. } else {
  97. ?>
  98. Je hebt recht #4 NIET.<br />
  99. <?php
  100. }
  101. // et cetera
  102. ?>
  103. <a href="logout.php">uitloggen</a><br />
  104. <?php
  105. } else {
  106. ?>
  107. Je bent op dit moment niet ingelogd.<br />
  108. <a href="login.php">inloggen</a><br />
  109. <?php
  110. }
  111. ?>
  112. </body>
  113. </html>
Download code! Download code (.txt)

 Stemmen
Niet ingelogd.

 Reacties
Post een reactie
Lees de reacties (92)
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.091s