Inloggen

Een aantal aspecten spelen een belangrijke rol:

Veiligheid

Pagina’s kunnen alleen maar ingezien worden indien er ingelogd is en er een bekende gebruikersnaam als sessionvariabele op de server en cliënt aanwezig is.

Behouden van (ingevulde) informatie

Handig als er meerdere pagina’s op een webserver moeten worden bekeken. Eerder ingevulde gegevens raken dan niet verloren maar zijn opgeslagen in sessionvariabelen. Erg handig bijvoorbeeld bij webwinkels:

Aandachtspunten

Om een website te beveiligen met een login mogelijkheid moeten aan een aantal voorwaarden worden voldaan. We houden dit onderwerp opervlakkig (je zou hier een heel PWS over kunnen schrijven)

Beveiligen tegen SQL injecties

Bij een heel eenvoudig login formulier is het vaak mogelijk om SQL injecties toe te passen om binnen te komen. Zie dit voor meer info als je er meer van wilt weten https://nl.wikipedia.org/wiki/SQL-injectie

Wij willen SQL injecties voorkomen dit kan door alle quotes te decoderen. Hiervoor is een eenvoudig te gebruiken PHP functie mysqli_real_escape_string($link,$_POST['variabele']).

Het is handig om vanaf nu elke variabele die je via een formulier wil invoeren/wijzigen/selecteren via een SQL query op de database eerst door deze functie te laten gaan. Voor een inlogformulier zou het er zo uit kunnen zien:

<?php
$gebruikersnaam = mysqli_real_escape_string($link, $_POST['gebruikersnaam']);
$wachtwoord = mysqli_real_escape_string($link, $_POST['wachtwoord']);
$result = mysqli_query($link, "SELECT * FROM users WHERE `username`='$gebruikersnaam'");
$user = mysqli_fetch_assoc($result);

//hierna nog even het wachtwoord verifieren met password_verify()

Ons inlogformulier is hiermee een stuk veiliger. Door het gebruik van prepared statements kan het nog veiliger worden gemaakt. Dit valt echter buiten de cursus.

Gebruikers en inloggegevens in de database

Om in te kunnen loggen moet je ergens opslaan wie toegang heeft tot de betreffende pagina. Om hiermee te oefenen maken we gebruik van de firstchoice database. Daarin staat een tabel users.

In deze tabel staan een paar belangrijke kolommen: name, email, password

Stel dat een hacker toegang krijgt tot onze database dan wil je niet dat de wachtwoorden van de gebruikers te lezen zijn. Om dit te voorkomen zullen we de wachtwoorden door een HASH functie laten gaan. Het wachtwoord wordt dan gecodeerd en kan nooit meer teruggecodeerd worden. Een HASH is dus een encryptie die niet omgedraaid kan worden.

Stel onze gebruiker heeft het wachtwoord 'secret' dan zal dit mogelijk encrypt worden naar

$2y$10$8LZsnQ3ul1k42Yniz3B79ev5A03fSaHKyaaF7/r1qHQyaXK8j2Bhm

Wanneer je gaat inloggen met je gebruikersnaam en wachtwoord kan je de php functie password_verify("ingevoerde wachtwoord","wachtwoord in de database") gebruiken om te controleren of het ingevoerde wachtwoord juist is. Er volgt straks in opdracht 50 een voorbeeld script hoe dit verder in zijn werkt gaat.

 

Gebruikers toevoegen

Omdat het via Heidi en PHPMyAdmin lastig is om een gebruik toe te voegen met een wachtwoord met HASH is hieronder een script dat je kan gebruiken om gebruikers toe te voegen. Let op, elke keer dat het script wordt uitgevoerd zal een gebruiker worden toegevoegd.

Copy-paste het script en sla op als add_user.php

<?php
//connectie met de gewenste database
include "connect_firstchoice.php";

//gebruiker met onderstaande gegevens zal worden toegevoegd
$username = 'admin';
$email = 'email@mail.nl';
$password = 'password';

//indien de gebruik al bestaat verwijderen we de gebruiker
mysqli_query($link, "DELETE FROM users WHERE `name`='$username'");

mysqli_query($link, "INSERT INTO users(`name`, `email`, `password`) VALUES ('$username','$email','" . password_hash($password, PASSWORD_BCRYPT) . "')")
or die ("Er ging iets fout bij de gebruiker aanmaken: " . mysqli_error($link));
if (mysqli_affected_rows($link)) {
    echo "Gebruiker $username met wachtwoord $password is aangemaakt";
}