Veilig login script, op zoek naar cookie protectie
index.php?actie=verifieren
Code (php)
1
2
3
4
5
2
3
4
5
# Kijken of er al een sessie bestaat
if(!isSet($_SESSION)){
session_start();
session_regenerate_id(true);
}
if(!isSet($_SESSION)){
session_start();
session_regenerate_id(true);
}
Dan kom je uit bij de volgende code:
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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
# Verifieren van inloggegevens
if(isSet($_GET['actie']) && $_GET['actie'] == 'verifieren'){
# Controleren of de gegevens uit een formulier komen
if($_SERVER['REQUEST_METHOD'] != 'POST'){
$error_no_form = true;
# Kijken of alle waarden gevuld zijn
}else if(isSet($_POST['email']) && $_POST['email'] == '' || isSet($_POST['wachtwoord']) && $_POST['wachtwoord'] == ''){
$error_gebruiker_wachtwoord = true;
}
# Kijken of er een "geldig" e-mailadres opgegeven is
else if(!preg_match("/^[A-Za-z0-9._\-]+\@[A-Za-z0-9._\-]+\.[A-Za-z]{2,4}$/", $_POST['email'])){
$error_email = true;
}
# Begin met afhandeling
else{
# Wachtwoord encrypten
$wachtwoord = crypt($_POST['wachtwoord'], '$6$rounds=5909$wootsaltforthesecretpassword$');
# Gegevens uit database ophalen.
$query = sprintf("SELECT * FROM gebruikers WHERE email='%s' AND wachtwoord='%s'",
mysql_real_escape_string($_POST['email']),
mysql_real_escape_string($_POST['wachtwoord'])
);
$resultaat = mysql_query($query, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
$aantalRijen_resultaat = mysql_num_rows($resultaat);
$rij = mysql_fetch_assoc($resultaat);
# Als er geen resultaat is, dan kloppen de gegevens dus niet
if($aantalRijen_resultaat == 0){
$error_verkeerde_gegevens = true;
}
# Anders kloppen de gegevens wel
else{
# Inlog hash genereren, combinatie van browser + ip adres
$hash = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
# Gebruiker_id en de hash in een sessie knallen
$_SESSION['gebruiker_id'] = $rij['gebruiker_id'];
$_SESSION['hash'] = $hash;
# Als de hash niet leeg is en ook niet overeenkomt met de gegeneerde hash, dan kan het zijn dat je vanaf een andere locatie ingelogd bent, b.v. PC thuis/ PC werk
if($rij['secret_hash'] != '' && $rij['secret_hash'] != $hash){
$error_loggedin = true;
}
# Anders log je op dit moment van de plek in waar je eerder ook ingelogd bent geweest
else{
# Nieuwe hash in de database zetten om te zorgen dat deze goed staat
$query_update_sorteervolgorde = sprintf("UPDATE gebruikers SET secret_hash='%s' WHERE gebruiker_id='%s'",
mysql_real_escape_string($hash),
mysql_real_escape_string($rij['gebruiker_id'])
);
mysql_query($query_update_sorteervolgorde, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query_update_sorteervolgorde . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
$succes_login = true;
}
}
}
}
if(isSet($_GET['actie']) && $_GET['actie'] == 'verifieren'){
# Controleren of de gegevens uit een formulier komen
if($_SERVER['REQUEST_METHOD'] != 'POST'){
$error_no_form = true;
# Kijken of alle waarden gevuld zijn
}else if(isSet($_POST['email']) && $_POST['email'] == '' || isSet($_POST['wachtwoord']) && $_POST['wachtwoord'] == ''){
$error_gebruiker_wachtwoord = true;
}
# Kijken of er een "geldig" e-mailadres opgegeven is
else if(!preg_match("/^[A-Za-z0-9._\-]+\@[A-Za-z0-9._\-]+\.[A-Za-z]{2,4}$/", $_POST['email'])){
$error_email = true;
}
# Begin met afhandeling
else{
# Wachtwoord encrypten
$wachtwoord = crypt($_POST['wachtwoord'], '$6$rounds=5909$wootsaltforthesecretpassword$');
# Gegevens uit database ophalen.
$query = sprintf("SELECT * FROM gebruikers WHERE email='%s' AND wachtwoord='%s'",
mysql_real_escape_string($_POST['email']),
mysql_real_escape_string($_POST['wachtwoord'])
);
$resultaat = mysql_query($query, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
$aantalRijen_resultaat = mysql_num_rows($resultaat);
$rij = mysql_fetch_assoc($resultaat);
# Als er geen resultaat is, dan kloppen de gegevens dus niet
if($aantalRijen_resultaat == 0){
$error_verkeerde_gegevens = true;
}
# Anders kloppen de gegevens wel
else{
# Inlog hash genereren, combinatie van browser + ip adres
$hash = md5($_SERVER['HTTP_USER_AGENT'] . $_SERVER['REMOTE_ADDR']);
# Gebruiker_id en de hash in een sessie knallen
$_SESSION['gebruiker_id'] = $rij['gebruiker_id'];
$_SESSION['hash'] = $hash;
# Als de hash niet leeg is en ook niet overeenkomt met de gegeneerde hash, dan kan het zijn dat je vanaf een andere locatie ingelogd bent, b.v. PC thuis/ PC werk
if($rij['secret_hash'] != '' && $rij['secret_hash'] != $hash){
$error_loggedin = true;
}
# Anders log je op dit moment van de plek in waar je eerder ook ingelogd bent geweest
else{
# Nieuwe hash in de database zetten om te zorgen dat deze goed staat
$query_update_sorteervolgorde = sprintf("UPDATE gebruikers SET secret_hash='%s' WHERE gebruiker_id='%s'",
mysql_real_escape_string($hash),
mysql_real_escape_string($rij['gebruiker_id'])
);
mysql_query($query_update_sorteervolgorde, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query_update_sorteervolgorde . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
$succes_login = true;
}
}
}
}
Uiteindelijk haalt hij dan op deze manier de gebruiker op:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
# Gebruiker selecteren aan de hand van sessie gebruiker id en sessie hash
if(isSet($_SESSION['gebruiker_id']) && isSet($_SESSION['hash'])){
$query = "SELECT * FROM gebruikers WHERE gebruiker_id = '" . $_SESSION['gebruiker_id'] . "' AND secret_hash='" . $_SESSION['hash'] . "'";
$resultaat = mysql_query($query, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
$rij = mysql_fetch_assoc($resultaat);
}
if(isSet($_SESSION['gebruiker_id']) && isSet($_SESSION['hash'])){
$query = "SELECT * FROM gebruikers WHERE gebruiker_id = '" . $_SESSION['gebruiker_id'] . "' AND secret_hash='" . $_SESSION['hash'] . "'";
$resultaat = mysql_query($query, $verbindDatabase) or die("A MySQL error has occurred.<br />Query: " . $query . "<br /> Error: (" . mysql_errno() . ") " . mysql_error());
$rij = mysql_fetch_assoc($resultaat);
}
Vervolgens doe ik dit om een secure pagina te laden
Ik heb eigenlijk maar wat gedaan, maar hoe veilig is dit? Soms heb ik wel eens als ik een tijdje niks doe ik dat "opeens" uitgelogd ben, dit vind ik eigenlijk vreemd, want in principe controleer ik op browser + ip adres en aangezien deze hetzelfde zijn gebleven zou ik dus ingelogd moeten blijven.
Hoe kan ik dit verbeteren? Kan ik iets met een cookie doen ofzo? Is dat nodig?
Graag wat hulp, ik wil een zo veilig mogelijk script namelijk.
Er zijn nog geen reacties op dit bericht.