aanmeld.php
<?php
require("connect.php"); // verbinding met de database maken
?>
<html>
<head>
<title>sessies · aanmelden</title>
</head>

<body>
<?php
// als het formulier nog niet is ingevuld
if(!isset($_POST['submit'])) {
?>
<form action="aanmeld.php" method="post">
naam <input type="text" name="naam" size="40" maxlength="20" /><br />
wachtwoord <input type="password" name="wacht1" size="40" maxlength="30" /><br />
wachtwoord opnieuw <input type="password" name="wacht2" size="40" maxlength="30" /><br />
<!--
en wat je verder over deze gebruiker bij wilt houden
bijvoorbeeld leeftijd, woonplaats, email, ...
voor het opvragen van het wachtwoord etc. etc.
hier moet je dan ook velden voor in je tabel 'members' aanmaken.
Op deze extra velden moeten hieronder ook controles uitgevoerd worden of ze ingevuld zijn!
-->
<input type="submit" name="submit" value="submit" />
</form>
<?php
// formulier gepost, kijk of alle velden ook daadwerkelijk zijn ingevuld
} elseif(trim($_POST['naam']) <> "" && trim($_POST['wacht1']) <> "") {
  // formulier ingevuld - kijk eerst of de gebruiker al bestaat
  $naam = $_POST['naam'];
  $res = mysql_query("SELECT * FROM users WHERE name='".$naam."'") or die(mysql_error());
  if(mysql_num_rows($res) == 0) {
    // geen resultaten - dit is wat we willen
    // kijk of de opgegeven wachtwoorden overeenkomen
    if(!strcmp($_POST['wacht1'], $_POST['wacht2'])) {
      // wachtwoorden komen overeen - sla alle gegevens op in de database
      // naam is al opgehaald uit het formulier
      $wacht = md5($_POST['wacht1']); // versleuteld wachtwoord
      $level = 1;                     // standaard gebruikersniveau
      mysql_query("INSERT INTO users (name, pass, level) VALUES ('".$naam."','".$wacht."',".$level.")") or die(mysql_error());

      // geef melding weer
?>
Je gegevens zijn opgeslagen.<br />
Je kunt <a href="login.php">hier</a> naartoe om in te loggen.<br />
<?php
    } else {
      // wachtwoorden komen niet overeen
?>
De twee opgegeven wachtwoorden zijn niet hetzelfde.<br />
Druk op de "back" knop van je browser en voer twee identieke wachtwoorden in.<br />
<?php
   }
  } else {
    // er bestaat al een gebruiker met deze naam
?>
Er bestaat al een gebruiker met deze naam.<br />
Druk op de "back" knop van je browser en geef een andere naam op.<br />
<?php
  }
} else {
  // sommige velden zijn niet ingevuld
?>
Alle velden dienen ingevuld te worden.<br />
Druk op de "back" toets en vul in alle velden wat in.<br />
<?php
}
?>
</body>
</html>

connect.php
<?php
$host = ""; // je hostname, meestal localhost
$user = ""; // je username
$pass = ""; // je wachtwoord
$dbas = ""; // je database-naam

// connect naar database
if(mysql_connect($host, $user, $pass)) {
  // selecteer database
  mysql_select_db($dbas) or die(mysql_error());
} else {
  // connecten naar database is mislukt
  echo "Failed to connect to database.";
  exit;
}
?>

login.php
<?php
require("connect.php"); // connectie met database maken en database selecteren
session_start(); // start een sessie of zet een sessie voort

// controleer hier of iemand inlogt - dit moet _voor_ de <HTML>-tag gebeuren gebeuren
if(isset($_POST['login'])) {
  if(trim($_POST['naam']) <> "" && trim($_POST['wacht']) <> "") {
    // naam en wachtwoord zijn ingevuld. Haal het (versleutelde) wachtwoord en
    // het gebruikersniveau dat bij deze gebruikersnaam hoort uit de database op
    // en vergelijk dit wachtwoord met het in het formulier opgegeven wachtwoord.

    $naam  = $_POST['naam'];
    $wacht = md5($_POST['wacht']);
    $res = mysql_query("SELECT id, pass, level FROM users where name='".$naam."'") or die(mysql_error());

    // Als er een resultaat is, oftewel er bestaat een gebruiker met de naam $naam
    if(mysql_num_rows($res) > 0) {
      $row = mysql_fetch_assoc($res);
      // aanname: het wachtwoord in de database is eenmalig gehashed mbv de functie md5()
      // vergelijk het opgehaalde wachtwoord met een versleutelde versie van het in het
      // formulier opgegeven wachtwoord
      if(!strcmp($wacht, $row['pass'])) {
        // alle gegevens kloppen

        // v1.2 extra functionaliteit, onthouden login
        // wil de gebruiker zijn gegevens onthouden ?
        if(isset($_POST['memory'])) {
          // set cookie (voor 2 maanden) en onthoud het IP
          // gebruik hierbij het id van de gebruiker
          setcookie("login_cookie", $row['id'].";".$row['pass'], time()+3600*24*31*2, "/");
          $ip = $_SERVER['REMOTE_ADDR'];
          mysql_query("UPDATE users SET last_ip='".$ip."' WHERE id=".$row['id']) or die(mysql_error());
        }

        // vul sessievariabelen
        $_SESSION['suser']    = $naam;         // gebruikersnaam van ingelogd persoon
        $_SESSION['slevel']   = $row['level']; // bijbehorende gebruikersniveau
        $_SESSION['stime']    = time();        // de huidige tijd
        $_SESSION['smaxidle'] = 60 * 60;       // het aantal seconden inactiviteit
      } else {
        // wachtwoorden komen niet overeen, breek de sessie weer af
        $_SESSION = array();
        session_destroy();
      }
      // geef de resultaten van deze query weer vrij
      unset($row);
      mysql_free_result($res);
    }
    // ververs, of de gebruikersnaam/wachtwoord combinatie nou klopt of niet, de pagina
    header("Location: login.php");
  }
}
?>
<html>
<head>
<title>sessies · login</title>
</head>

<body>
<?php
// als de (een willekeurige) sessievariabele suser in het sessie-array nog geen waarde heeft
// (dus als iemand nog niet is ingelogd)
if(!isset($_SESSION['suser'])) {
?>
<form action="login.php" method="post">
naam <input type="text" name="naam" size="15"><br />
wachtwoord <input type="password" name="wacht" size="15"><br />
<!-- v1.2 extra functionaliteit, login onthouden -->
<input type="checkbox" name="memory" value="1"> onthoud mijn login (gebruikt cookie)<br />
<input type="submit" name="login" value="log in"><br />
</form>
<?php
} else {
  // de gebruiker is ingelogd - geef een welkomstboodschap oid
  // hier kun je tevens kijken of alle sessievariabelen de goede
  // waarden hebben (debugging)
?>
Hi <b><?= $_SESSION['suser'] ?></b>,<br />
<a href="voorbeeld.php">voorbeeld pagina</a><br />
<a href="logout.php">uitloggen</a><br />
<?php
}
?>
</body>
</html>

logout.php
<?php
session_start();     // start een sessie of zet een sessie voort
$_SESSION = array(); // maak het sessie array leeg
session_destroy();   // verwijder de sessie

// als er een cookie geset is, reset deze
if(isset($_COOKIE['login_cookie'])) {
  setcookie("login_cookie", "", time(), "/");
}
?>
<html>
<head>
<title>sessies · logout</title>
</head>

<body>
Uitgelogd.<br />
<a href="voorbeeld.php">voorbeeld pagina</a><br />
<a href="login.php">(opnieuw) inloggen</a><br />
</body>
</html>

session.php
<?php
session_start(); // start een sessie of zet een sessie voort

// als de gebruiker is ingelogd
if(isset($_SESSION['suser'])) {
  // het volgende timeout deel is optioneel - dit mag worden weggelaten
  // * timeout gedeelte *
  $now = time();
  // als er meer tijd is verstreken dan smaxidle
  // sinds het aanmaken van de sessie
  if($now - $_SESSION['stime'] > $_SESSION['smaxidle']) {
    // breek de sessie af, de gebruiker dient opnieuw in te loggen
    $_SESSION = array();
    session_destroy();
  } else {
    // ververs anders de sessietijd. Dit zorgt er voor
    // dat de gebruiker ingelogd blijft zolang deze actief is.
    $_SESSION['stime'] = $now;
  }
  // * einde timeout gedeelte *
// v1.2 extra functionaliteit, onthouden login
} elseif(isset($_COOKIE['login_cookie'])) {
  // bekijk de waarden van de cookie en als deze kloppen met de database - start alsnog een sessie
  // aanname - er is een verbinding met de database
  list($id, $wacht) = split(";", $_COOKIE['login_cookie']);
  $res = mysql_query("SELECT id, pass, level, last_ip FROM users WHERE id='".$id."'") or die(mysql_error());
  if(mysql_num_rows($res) > 0) {
    $row = mysql_fetch_assoc($res);
    if(!strcmp($wacht, $row['pass']) && $_SERVER['REMOTE_ADDR'] == $row['last_ip']) {
      // init session
      $_SESSION['suser']    = $naam;
      $_SESSION['slevel']   = $row['level'];
      $_SESSION['stime']    = time();
      $_SESSION['smaxidle'] = 60 * 60;

      // update cookie
      // gebruik hierbij wederom het id en het versleutelde wachtwoord
      setcookie("login_cookie", $id.";".$wacht, time()+3600*24*31*2, "/");
    } else {
      // password of ip komt niet overeen - unset het cookie en beeindig de sessie
      setcookie("login_cookie", "", time(), "/");
      $_SESSION = array();
      session_destroy();
    }
    // geef resultaten vrij
    unset($row);
    mysql_free_result($res);
  } else {
    // gebruiker onbekend, cookie vervalst ?
    $_SESSION = array();
    session_destroy();
  }
  // ververs de pagina
  header("Location: ".$_SERVER['REQUEST_URI']);
}
?>

voorbeeld.php
<?php
// include/require hier evt nog andere zaken
require ("connect.php");
// we willen op deze pagina gebruik maken van beveiliging mbv sessies,
// dus includen (requiren) we session.php
require("session.php");
?>
<html>
<head>
<title>sessies · voorbeeld</title>
</head>

<body>
<?php
/*
we gaan hier kijken of de gebruiker is ingelogd, en welk
user level de gebruiker heeft. Op grond daarvan laten we
bepaalde delen al dan niet zien.
Een gebruikerslevel is een getal wat aangeeft hoeveel
"macht" je hebt. Vaak is het zo: hoe hoger het getal, hoe
meer je mag.
bijvoorbeeld:
Voor een bepaalde bewerking heb je gebruikers-
niveau 1 nodig, maar voor een andere bewerking heb je niveau
2 nodig. Een gebruiker die beide bewerkingen mag uitvoeren
heeft gebruikersniveau 1+2 = 3. MAAR: Een gebruiker die om
een of andere reden alleen de tweede bewerking mag uitvoeren
heeft gebruikersniveau 0+2 = 2. Dus je telt de nummers die
bij bepaalde rechten horen bij elkaar op.
Het nummer dat het recht geeft op een bepaalde bewerking is
altijd een macht van 2.
bijvoorbeeld:
recht #1 (bv inloggen) heeft gebruikers niveau            2^0 = 1
recht #2 (bv je eigen info veranderen) heeft gebr. niveau 2^1 = 2
recht #3 (bv nieuws toevoegen) heeft gebruikers niveau    2^2 = 4
recht #4 (bv members toevoegen) heeft gebruikersniveau    2^3 = 8
enz.
Iemand die al deze bewerkingen mag uitvoeren heeft dus
gebruikersniveau 1+2+4+8 = 15 (of 2^4 - 1)
Iemand die alleen recht #1 en recht #3 heeft, heeft
dus gebruikersniveau 1+4 = 5
*/
// controle op ingelogd zijn:
if(isset($_SESSION['suser'])) {
?>
user <b><?= $_SESSION['suser'] ?></b> is logged in.<br />
<?php
  /*
  vervolgens kijken we naar het userlevel, we vergelijken
  bitsgewijs het gebruikerslevel - dit doen we met behulp van
  een enkele '&' (de bitwise comparator)
  *** LET OP ***
  Enkel controleren met & is niet genoeg !
  Stel dat je level 9 moet hebben voor een bepaalde bewerking, en je hebt
  maar level 1. 1 & 9 is gelijk aan 1, en dan zou if(1 & 9) { ... } true opleveren
  Je moet dus expliciet controleren of je level hoog genoeg is.
  */
  if(($_SESSION['slevel'] & 1) == 1) {
    // voer code uit behorend bij recht #1
?>
Je hebt recht #1.<br />
<?php
  } else {
    // geef een melding dat je de acties
    // behorend bij recht #1 niet mag uitvoeren
?>
Je hebt recht #1 NIET.<br />
<?php
  }

  if(($_SESSION['slevel'] & 2) == 2) {
    // voer code uit behorend bij recht #2
?>
Je hebt recht #2.<br />
<?php
  } else {
?>
Je hebt recht #2 NIET.<br />
<?php
  }
  if(($_SESSION['slevel'] & 4) == 4) {
    // voer code uit behorend bij recht #3
?>
Je hebt recht #3.<br />
<?php
  } else {
?>
Je hebt recht #3 NIET.<br />
<?php
  }
  if(($_SESSION['slevel'] & 8) == 8) {
    // voer code uit behorend bij recht #4
?>
Je hebt recht #4.<br />
<?php
  } else {
?>
Je hebt recht #4 NIET.<br />
<?php
  }
  // et cetera
?>
<a href="logout.php">uitloggen</a><br />
<?php
} else {
?>
Je bent op dit moment niet ingelogd.<br />
<a href="login.php">inloggen</a><br />
<?php
}
?>
</body>
</html>