3min Devops

How to: Een veilig loginscript maken in php

Formulier verwerkingen

Om de inlog procedure goed te laten verlopen gaan we de ingevoerde gegevens natuurlijk ergens op controleren:
• Gebruikersnaam ingevoerd, groter dan 3 tekens, bestaande in database
• Wachtwoord bij de gebruikersnaam past
Dit stoppen we allemaal in dezelfde pagina als het inlogformulier. Laten we eerst weer even een stuk code er tegen aan gooien, die ik daarna verder ga uitleggen:

PHP Code
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
 
<?
ob_start();
session_start();
 
if (empty($_POST['login']))
{
	// Het boven geschreven formulier komt hier.
} else {
	include("config.inc.php");
	$result  = mysql_query("SELECT id,username,password FROM users WHERE username = '".$_POST['username']."'") or die (mysql_error());
	$count = mysql_num_rows($result);
	$rij = mysql_fetch_array($result);
 
	// Deze functie zal de naam valideren
	function validate_name($username)
	{
		$u_length = strlen($username);
		if ($u_length <= "3" OR $username = "")
		{
			return FALSE;
		} else {
			return TRUE;
		}
	}
 
	// Deze functie zal kijken of de inlog gegevens kloppen
 	function validate_login($username,$password,$password2,$count)
	{
		if ($count != "1")
		{
			return FALSE;
		} else {
			$password = md5($password);
			if ($password2 != $password)
			{
				return FALSE;
			} else {
				return TRUE;
			}
		}
	}
 
	if (!validate_name($_POST['username']))
	{
		$err = "U hebt geen correcte gebruikersnaam opgegevens,<br>ga terug en probeer het nog eens.";
	} elseif (!validate_login($_POST['username'], $_POST['password'], $rij['password'], $count)) {
		$err = "Het wachtwoord komt niet overeen met je gebruikersnaam,<br>ga terug en probeer het nog eens.";
	}
 
	if (isset($err))
	{
		echo $err;
	} else {
		// Tijd instellen hoe lang de cookie blijft bestaan
		$tijd = 31536000;
		// Cookies aanmaken
		setcookie("user_id", $rij['id'],time()+$tijd,"/");
		setcookie("user_pass", $password,time()+$tijd,"/");
		if ($_COOKIE['user_id'] AND $_COOKIE['user_pass'])
		{
			$_SESSION['user_id'] = $_COOKIE['user_id'];
			$_SESSION['user_name'] = $rij['username'];
			echo "Je bent succesvol ingelogd!";	
		}
	}
}
ob_end_flush();
?>


Laten we deze lap code eens uitleggen:
Allereerst word er doormiddel van een if lus afgevraagd of hij het formulier moet laten zien of dat hij de ingevoerde gegevens moet verwerken. Als hij het formulier moet laten weergeven lijkt me dit duidelijk. Als men eenmaal op post heeft geklikt dan moet het script wat met de ingevoerde gegevens doen, dit wordt behandeld in het volgende stukje code.
Allereerst zie je 2 functies, de eerste bekijkt of de ingevoerde gebruikersnaam langer is dan 3 tekens en of hij niet leeg is. De 2e functie bekijkt of de username wel daadwerkelijk in de database bestaat, als deze bestaat dan controleert hij of het ingevoerde wachtwoord overeen komt met de gebruikersnaam. Zoals je ziet wordt het ingevoerde wachtwoord gecodeerd d.m.v. md5() encryptie, md5 kun je niet terugcoderen naar het originele. Vervolgens word er gecontroleerd of hij door de functie heen komt zo niet krijgt hij de waarde FALSE en word er een variabele ($err) gegenereerd waaraan een foutmelding zit gekoppeld.
Als dit hele script is doorlopen komen we aan bij de laatste if-lus, hier word gekeken of er daadwerkelijk ingelogd wordt of niet, als dit niet het geval is krijgt de gebruiker de waarde van de variabele $err te zien.

Hèhè eindelijk aangekomen bij het inloggen, allereerst worden er twee cookies aangemaakt waarin het gecodeerde wachtwoord en de user_id in word opgeslagen. Vervolgens wordt gecontroleerd of dit goed is gebeurt. Als dat zo is dan worden er 2 sessies variabelen met het user_id en de username gecreëerd.