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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
  }

?>

Dan zullen we moeten kijken of het formulier is verzonden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
    // 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)
PHP script in nieuw venster Selecteer het PHP script
1
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
?>

Nu zijn we ingelogd, wat rest nog: er moet onthouden worden dat we ingelogd zijn, daarvoor gaan we dus de sessies gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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!';
    }
  }

?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
// 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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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 } */
?>


Fijn dat dat werkt, nu nog zorgen dat we op alle beveiligde pagina's kunnen kijken of er ingelogd is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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 :-) )
  }
?>

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.

« Lees de omschrijving en reacties

Inhoudsopgave

  1. Inleiding
  2. Het formulier
  3. Formulier verwerken
  4. JavaScript Secure Hash Algorithm, SHA1

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.