Wat leer je deze week?

Tot nu toe werkte jouw applicatie vooral met data zoals taken, notities of opdrachten.

Deze week voeg je gebruikers toe aan je applicatie.

Je leert hoe een registratiesysteem werkt en hoe je wachtwoorden veilig opslaat in een database.

Dit is de eerste stap richting een echt login systeem.

Kernconcepten (in normale mensentaal)

Een registratiesysteem werkt eigenlijk als een aanmeldformulier voor jouw app.

Een gebruiker:

  • kiest een gebruikersnaam
  • kiest een wachtwoord
  • verstuurt het formulier
  • PHP slaat de gebruiker op in de database

Maar:

wachtwoorden sla je NOOIT letterlijk op.

Dus niet:

wachtwoord123

Waarom niet?

Als iemand toegang krijgt tot de database, kunnen alle wachtwoorden gelezen worden 😭

Daarom gebruik je hashing.

Hashing verandert een wachtwoord in een soort onleesbare code.

Bijvoorbeeld:

wachtwoord123
↓
$2y$10$8X...

PHP kan later nog steeds controleren of het wachtwoord klopt, zonder het echte wachtwoord op te slaan.

Wat moet je kennen?

1. Een registratieformulier maken

Uitleg
Een gebruiker vult een formulier in met een gebruikersnaam en wachtwoord.

Wat moet je kennen

  • method="POST"
  • input type="text"
  • input type="password"

Voorbeeld

<form method="POST">

    <input 
        type="text" 
        name="username"
        placeholder="Gebruikersnaam"
    >

    <input 
        type="password" 
        name="password"
        placeholder="Wachtwoord"
    >

    <button type="submit">
        Registreren
    </button>

</form>

Onthoud: type="password" verbergt wat de gebruiker typt.

2. POST-data uitlezen

Uitleg
PHP ontvangt de formulierdata via $_POST.

Wat moet je kennen

  • $_POST
  • ?? ''
  • formulierdata uitlezen

Voorbeeld

$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

Onthoud: Gebruik een fallback zodat je geen warnings krijgt.

3. password_hash() gebruiken

Uitleg
Wachtwoorden sla je nooit letterlijk op in de database.
Daarom gebruik je password_hash().

Wat moet je kennen

  • password_hash()
  • PASSWORD_DEFAULT
  • hashing

Voorbeeld

$hash = password_hash(
    $password,
    PASSWORD_DEFAULT
);

Resultaat

supergeheimwachtwoord
↓
$2y$10$9vM...

Onthoud: Je slaat de hash op, niet het echte wachtwoord.

4. Een gebruiker opslaan in de database

Uitleg
Nadat het wachtwoord gehashed is, kun je de gebruiker opslaan.

Wat moet je kennen

  • INSERT INTO
  • prepared statements
  • placeholders ?

Voorbeeld

$stmt = $pdo->prepare("
    INSERT INTO users (username, password)
    VALUES (?, ?)
");

$stmt->execute([$username, $hash]);

Onthoud: De database krijgt de hash, niet het originele wachtwoord.

5. Een users tabel maken

Uitleg
Voor een login systeem heb je een aparte tabel nodig voor gebruikers.

Wat moet je kennen

  • CREATE TABLE
  • VARCHAR
  • AUTO_INCREMENT
  • PRIMARY KEY

Voorbeeld

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255),
    password VARCHAR(255)
);

Onthoud: De password kolom moet groot genoeg zijn voor hashes.

Veelgemaakte fouten (met voorbeelden)

1. Het echte wachtwoord opslaan

Dit is onveilig.

Fout

$stmt->execute([$username, $password]);

Beter

$stmt->execute([$username, $hash]);

2. password_hash() vergeten

Dan wordt het wachtwoord leesbaar opgeslagen in de database.

Fout

$password = $_POST['password'];

Beter

$hash = password_hash(
    $password,
    PASSWORD_DEFAULT
);

3. type="text" gebruiken voor wachtwoorden

Dan kan iedereen meekijken 😭

Fout

<input type="text" name="password">

Beter

<input type="password" name="password">

4. Geen prepared statements gebruiken

Directe queries zijn minder veilig.

Fout

$pdo->query("
    INSERT INTO users 
    VALUES ('$username', '$hash')
");

Beter

$stmt = $pdo->prepare("
    INSERT INTO users (username, password)
    VALUES (?, ?)
");

$stmt->execute([$username, $hash]);

5. Een te kleine password kolom gebruiken

Hashes zijn veel langer dan normale wachtwoorden.

Fout

password VARCHAR(20)

Beter

password VARCHAR(255)

Snippets

POST-data uitlezen

$username = $_POST['username'] ?? '';
$password = $_POST['password'] ?? '';

Wachtwoord hashen

$hash = password_hash(
    $password,
    PASSWORD_DEFAULT
);

Gebruiker opslaan

$stmt = $pdo->prepare("
    INSERT INTO users (username, password)
    VALUES (?, ?)
");

$stmt->execute([$username, $hash]);

Redirect gebruiken

header('Location: login.php');
exit;

Checken of formulier verstuurd is

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

}

Video (coming soon)

Video komt eraan

Zodra de uitlegvideo beschikbaar is, wordt alleen de YouTube-ID vervangen.