Formulier verwerken
Nu het formulier in orde is zullen we het ook nog moeten verwerken, daar gaat dit stuk over.
We gaan gebruik maken van sessies, en een MySQL database.
De code begint dus zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
session_start();
// maak verbinding met database
mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ('Kan niet verbinden met database!');
// selecteer de juiste db
mysql_select_db(DB_NAME) or die ('Kan database niet vinden');
// functie voor random key
function make_rand($length) {
$chars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ1234567890";
$rand = '';
for ($i = 1; $i <= $length; $i++) {
$num = rand(0, strlen($chars));
$rand .= substr($chars, $num, 1);
}
return $rand;
}
?>
session_start();
// maak verbinding met database
mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ('Kan niet verbinden met database!');
// selecteer de juiste db
mysql_select_db(DB_NAME) or die ('Kan database niet vinden');
// functie voor random key
function make_rand($length) {
$chars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ1234567890";
$rand = '';
for ($i = 1; $i <= $length; $i++) {
$num = rand(0, strlen($chars));
$rand .= substr($chars, $num, 1);
}
return $rand;
}
?>
Dan zullen we moeten kijken of het formulier is verzonden:
Code (php)
1
2
3
4
2
3
4
<?php
// kijk of formulier is verzonden
if ($_SERVER['REQUEST_METHOD'] == "POST") { // indien verzonden
?>
// kijk of formulier is verzonden
if ($_SERVER['REQUEST_METHOD'] == "POST") { // indien verzonden
?>
Vervolgens gaan we zoeken of de gebruiker voorkomt en het wachtwoord controleren in de db, houd rekening met MySQL injection (in dit geval via addslashes):
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$query= mysql_query("SELECT * FROM users WHERE username = '" . addslashes($_POST['username']) . "'");
if (mysql_num_rows($query) > 0) { // als er een gebruiker is gevonden
$user = mysql_fetch_object($query);
if ($user->pass == sha1($_POST['password'])) { // als het wachtwoord klopt
?>
$query= mysql_query("SELECT * FROM users WHERE username = '" . addslashes($_POST['username']) . "'");
if (mysql_num_rows($query) > 0) { // als er een gebruiker is gevonden
$user = mysql_fetch_object($query);
if ($user->pass == sha1($_POST['password'])) { // als het wachtwoord klopt
?>
Nu zijn we ingelogd, wat rest nog: er moet onthouden worden dat we ingelogd zijn, daarvoor gaan we dus de sessies gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$_SESSION['user_id'] = $user->user_id;
$_SESSION['session_id'] = make_rand(50); // maak een random string voor sessie session_id mbv van functie
// zet de sessie id in de db zodat we hem later kunnen controleren
mysql_query("UPDATE users SET session_id = '" . $_SESSION['session_id'] . "' WHERE user_id = '" . $_SESSION['user_id'] . "'");
echo 'Inloggen is gelukt!';
} else { // ongeldig wachtwoord
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
} else { // ongeldige gebruikersnaam
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
}
?>
$_SESSION['user_id'] = $user->user_id;
$_SESSION['session_id'] = make_rand(50); // maak een random string voor sessie session_id mbv van functie
// zet de sessie id in de db zodat we hem later kunnen controleren
mysql_query("UPDATE users SET session_id = '" . $_SESSION['session_id'] . "' WHERE user_id = '" . $_SESSION['user_id'] . "'");
echo 'Inloggen is gelukt!';
} else { // ongeldig wachtwoord
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
} else { // ongeldige gebruikersnaam
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
}
?>
Je zou vast denken: mooi, werkt. maar dat is helaas niet helemaal zo. Er bestaat namelijk zoiets als session hijacking. Fijn, maar hoe lossen we dit op; simpel ip noteren:
Code (php)
1
2
3
4
2
3
4
<?php
// dit komt nadat je succesvol bent ingelogd
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADRESS'];
?>
// dit komt nadat je succesvol bent ingelogd
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADRESS'];
?>
Mooi, het uiteindelijke script komt er dus zo uit te zien:
Code (php)
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
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
<?php
session_start();
// maak verbinding met database
mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ('Kan niet verbinden met database!');
// selecteer de juiste db
mysql_select_db(DB_NAME) or die ('Kan database niet vinden');
// functie voor random key
function make_rand($length) {
$chars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ1234567890";
$rand = '';
for ($i = 1; $i <= $length; $i++) {
$num = rand(0, strlen($chars));
$rand .= substr($chars, $num, 1);
}
return $rand;
}
// kijk of formulier is verzonden
if ($_SERVER['REQUEST_METHOD'] == "POST") { // indien verzonden
$query= mysql_query("SELECT * FROM users WHERE username = '" . addslashes($_POST['username']) . "'");
if (mysql_num_rows($query) > 0) { // als er een gebruiker is gevonden
$user = mysql_fetch_object($query);
if ($user->pass == sha1($_POST['password'])) { // als het wachtwoord klopt
$_SESSION['user_id'] = $user->user_id;
$rand_key = make_rand(50); // maak een random string voor sessie session_id mbv van functie
$_SESSION['session_id'] = $rand_key;
// zet de sessie id in de db zodat we hem later kunnen controleren
mysql_query("UPDATE users SET session_id = '" . $rand_key . "' WHERE user_id = '" . $_SESSION['user_id'] . "'");
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADRESS'];
echo 'Inloggen is gelukt!';
} else { // ongeldig wachtwoord
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
} else { // ongeldige gebruikersnaam
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
} /* else { hier zou je het formulier kunnen zetten } */
?>
session_start();
// maak verbinding met database
mysql_connect(DB_HOST, DB_USER, DB_PASS) or die ('Kan niet verbinden met database!');
// selecteer de juiste db
mysql_select_db(DB_NAME) or die ('Kan database niet vinden');
// functie voor random key
function make_rand($length) {
$chars = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ1234567890";
$rand = '';
for ($i = 1; $i <= $length; $i++) {
$num = rand(0, strlen($chars));
$rand .= substr($chars, $num, 1);
}
return $rand;
}
// kijk of formulier is verzonden
if ($_SERVER['REQUEST_METHOD'] == "POST") { // indien verzonden
$query= mysql_query("SELECT * FROM users WHERE username = '" . addslashes($_POST['username']) . "'");
if (mysql_num_rows($query) > 0) { // als er een gebruiker is gevonden
$user = mysql_fetch_object($query);
if ($user->pass == sha1($_POST['password'])) { // als het wachtwoord klopt
$_SESSION['user_id'] = $user->user_id;
$rand_key = make_rand(50); // maak een random string voor sessie session_id mbv van functie
$_SESSION['session_id'] = $rand_key;
// zet de sessie id in de db zodat we hem later kunnen controleren
mysql_query("UPDATE users SET session_id = '" . $rand_key . "' WHERE user_id = '" . $_SESSION['user_id'] . "'");
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADRESS'];
echo 'Inloggen is gelukt!';
} else { // ongeldig wachtwoord
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
} else { // ongeldige gebruikersnaam
echo 'Ongeldig wachtwoord/gebruikersnaam!';
}
} /* else { hier zou je het formulier kunnen zetten } */
?>
Fijn dat dat werkt, nu nog zorgen dat we op alle beveiligde pagina's kunnen kijken of er ingelogd is:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if (isset($_SESSION['user_id'], $_SESSION['user_ip'], $_SESSION['session_id']) && $_SESSION['user_ip'] == $_SERVER['REMOTE_ADRESS']) {
// sessies bestaan en ip klopt, dus gaan we verder met controleren van sessie session_id
$session_id = mysql_fetch_object(mysql_query("SELECT session_id FROM users WHERE user_id = '" . $_SESSION['user_id'] . "'"));
if ($_SESSION['session_id'] == $session_id->session_id) {
/*
alles klopt, dus we zijn hier klaar
eventueel zou je hier mooi iets kunnen zetten wat bijhoud wie waar is geweest
*/
} else { // session_id klopt niet
header('location: login.php'); // stuur door naar login pagina
}
} else { // sessies bestaan niet, of ip is onjuist
header('location: login.php'); // stuur door naar login pagina (alweer :-) )
}
?>
if (isset($_SESSION['user_id'], $_SESSION['user_ip'], $_SESSION['session_id']) && $_SESSION['user_ip'] == $_SERVER['REMOTE_ADRESS']) {
// sessies bestaan en ip klopt, dus gaan we verder met controleren van sessie session_id
$session_id = mysql_fetch_object(mysql_query("SELECT session_id FROM users WHERE user_id = '" . $_SESSION['user_id'] . "'"));
if ($_SESSION['session_id'] == $session_id->session_id) {
/*
alles klopt, dus we zijn hier klaar
eventueel zou je hier mooi iets kunnen zetten wat bijhoud wie waar is geweest
*/
} else { // session_id klopt niet
header('location: login.php'); // stuur door naar login pagina
}
} else { // sessies bestaan niet, of ip is onjuist
header('location: login.php'); // stuur door naar login pagina (alweer :-) )
}
?>
Zet bovenstaande in check.php of weet ik veel hoe je t noemen wil en include het in elke pagina die beveiligd is.
Nou dit was het dan alweer, hopelijk steek je er iets van op en als je iets op of aan te merken hebt dan hoor ik het wel denk ik.
« vorige pagina | volgende pagina »