Veiliger maken
Ik ben bezig om een login systeempje te maken, maar hoe kan ik het veilig maken, want iemand vertelde mij dat iedereen $_SESSION['ingelogd'] op true kan zetten. En dat je de gebruikersnaam nooit in een SESSIE mag zetten, maar hoe kun je anders later weer de gebruikersnaam oproepen?
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
session_start(); //We maken gebruik van sessies
# errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
# sql debug
define('DEBUG_MODE',true); // true == aan, false == uit
if ($_SESSION['ingelogd'] != true)
{
$con = mysql_connect("localhost","xxx","xxx"); // Verbinding met de database maken
$select = mysql_select_db("leden", $con);
$result = mysql_query("SELECT gebruikersnaam, wachtwoord, email, rang FROM leden
WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "'");
$row = mysql_fetch_assoc($result);
if (!$con || !$select)
{
echo '<div class="redbox"><b>Er kan momenteel geen verbinding worden gemaakt met de database. Er is al contact opgenomen met de webmaster.</b></div>';
mail('[email protected]', 'Mysql Error', 'Er kan momenteel geen verbinding worden gemaakt met de database.');
}
// SQL Function
function sql_query($query)
{
$mysql = mysql_query($query);
if ($mysql)
{
return $mysql;
} else
{
echo '<div class="redbox"><b>Fout in de database bij het uitvoeren van een query!</b></div>';
mail('[email protected]', 'Mysql Error', 'Fout in de database bij het uitvoeren van: ' . $query . '');
}
}
echo'
<html>
<head>
<title>Login</title>
<link href="style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>Login</h1>
<p>Login met uw gegevens.</p>
<form action="" method="post">
<table>
<tr><td>Gebruikersnaam: </td><td><input type="text" name="gebruikersnaam"/></td></tr>
<tr><td>Wachtwoord: </td><td><input type="password" name="wachtwoord"/></td></tr>
<tr><td><input type="submit" value="Login"/></td></tr>
</table>
</form>
<table width="35%">
<tr><td><a href="registreer.php">Registreren</a></td><td><a href="wachtwoordvergeten.php">Wachtwoord vergeten</a></td></tr>
</table>
</body>
</html>
';
if ($_POST['gebruikersnaam'] == $row['gebruikersnaam'] && sha1($_POST['wachtwoord']) == $row['wachtwoord']) //is de gebruikersnaam en wachtwoord goed ingevuld (uitlezen van database)
{
$_SESSION['ingelogd'] = true;
$_SESSION['gebruikersnaam'] = $_POST['gebruikersnaam'];
$_SESSION['rang'] = $row['rang'];
header('Refresh: 3; url=beveiligd.php');
echo '<div class="greenbox">Je bent succesvol ingelogd, je wordt nu doorgestuurd.</div>';
}
else
{
echo '<div class="redbox">De gebruikersnaam en/of wachtwoord is niet juist ingevuld.</div>';
}
}
else
{
echo "Je bent al ingelogd als: " . $_SESSION['gebruikersnaam'];
}
?>
session_start(); //We maken gebruik van sessies
# errors weergeven
ini_set('display_errors',1); // 1 == aan , 0 == uit
error_reporting(E_ALL | E_STRICT);
# sql debug
define('DEBUG_MODE',true); // true == aan, false == uit
if ($_SESSION['ingelogd'] != true)
{
$con = mysql_connect("localhost","xxx","xxx"); // Verbinding met de database maken
$select = mysql_select_db("leden", $con);
$result = mysql_query("SELECT gebruikersnaam, wachtwoord, email, rang FROM leden
WHERE gebruikersnaam='" . mysql_real_escape_string($_POST['gebruikersnaam']) . "'");
$row = mysql_fetch_assoc($result);
if (!$con || !$select)
{
echo '<div class="redbox"><b>Er kan momenteel geen verbinding worden gemaakt met de database. Er is al contact opgenomen met de webmaster.</b></div>';
mail('[email protected]', 'Mysql Error', 'Er kan momenteel geen verbinding worden gemaakt met de database.');
}
// SQL Function
function sql_query($query)
{
$mysql = mysql_query($query);
if ($mysql)
{
return $mysql;
} else
{
echo '<div class="redbox"><b>Fout in de database bij het uitvoeren van een query!</b></div>';
mail('[email protected]', 'Mysql Error', 'Fout in de database bij het uitvoeren van: ' . $query . '');
}
}
echo'
<html>
<head>
<title>Login</title>
<link href="style.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>Login</h1>
<p>Login met uw gegevens.</p>
<form action="" method="post">
<table>
<tr><td>Gebruikersnaam: </td><td><input type="text" name="gebruikersnaam"/></td></tr>
<tr><td>Wachtwoord: </td><td><input type="password" name="wachtwoord"/></td></tr>
<tr><td><input type="submit" value="Login"/></td></tr>
</table>
</form>
<table width="35%">
<tr><td><a href="registreer.php">Registreren</a></td><td><a href="wachtwoordvergeten.php">Wachtwoord vergeten</a></td></tr>
</table>
</body>
</html>
';
if ($_POST['gebruikersnaam'] == $row['gebruikersnaam'] && sha1($_POST['wachtwoord']) == $row['wachtwoord']) //is de gebruikersnaam en wachtwoord goed ingevuld (uitlezen van database)
{
$_SESSION['ingelogd'] = true;
$_SESSION['gebruikersnaam'] = $_POST['gebruikersnaam'];
$_SESSION['rang'] = $row['rang'];
header('Refresh: 3; url=beveiligd.php');
echo '<div class="greenbox">Je bent succesvol ingelogd, je wordt nu doorgestuurd.</div>';
}
else
{
echo '<div class="redbox">De gebruikersnaam en/of wachtwoord is niet juist ingevuld.</div>';
}
}
else
{
echo "Je bent al ingelogd als: " . $_SESSION['gebruikersnaam'];
}
?>
Gewijzigd op 08/05/2011 09:18:51 door Timo Kleinhout
2. Ik zou session_regenerate_id(true) aanroepen net voordat iemand daadwerkelijk is ingelogd, voorkomt session fixation!
@Kees, ik maak gewoon op elke pagina die hash opniew aan, zodat je niet met elke page view een extra query krijgt.
Victor X op 08/05/2011 10:53:21:
@Kees, ik maak gewoon op elke pagina die hash opniew aan, zodat je niet met elke page view een extra query krijgt.
Waarom zou je dit willen? Je voert elke keer weer een nieuwe (onnodige) query uit. Je kunt overigens ook niet kijken of die hash klopt d.m.v. een cookie of zoiets aangezien je toch elke keer een nieuwe maakt.
Dillen Meijboom op 08/05/2011 12:08:59:
Waarom zou je dit willen? Je voert elke keer weer een nieuwe (onnodige) query uit. Je kunt overigens ook niet kijken of die hash klopt d.m.v. een cookie of zoiets aangezien je toch elke keer een nieuwe maakt.
Victor X op 08/05/2011 10:53:21:
@Kees, ik maak gewoon op elke pagina die hash opniew aan, zodat je niet met elke page view een extra query krijgt.
Waarom zou je dit willen? Je voert elke keer weer een nieuwe (onnodige) query uit. Je kunt overigens ook niet kijken of die hash klopt d.m.v. een cookie of zoiets aangezien je toch elke keer een nieuwe maakt.
Je kan het ook nog combineren. Je hash opslaan in de database(ongecodeerd), cookie(gecodeeerd) en in de session(gecodeerd) en dan steeds de salt uit de database halen en daarmee blijven verifiëren. Dit gaat wel voor wat extra laadtijd zorgen.
Ik snap zelf bijna niet meer wat ik heb geschreven ik hoop jullie wel. :D
Zie trouwens ook een function declaratie 'sql_query' maar je gebruikt hem nergens :p
Verder, is de code niet echt netjes gestructureerd. Sowieso vind ik HTML genereren door het te printen met echo in PHP code lelijk.
Code (php)
is dat ook een goede manier?
Daniel Voogsgerd op 08/05/2011 12:28:24:
Je kan het ook nog combineren. Je hash opslaan in de database(ongecodeerd), cookie(gecodeeerd) en in de session(gecodeerd) en dan steeds de salt uit de database halen en daarmee blijven verifiëren. Dit gaat wel voor wat extra laadtijd zorgen.
Ik snap zelf bijna niet meer wat ik heb geschreven ik hoop jullie wel. :D
Dillen Meijboom op 08/05/2011 12:08:59:
Waarom zou je dit willen? Je voert elke keer weer een nieuwe (onnodige) query uit. Je kunt overigens ook niet kijken of die hash klopt d.m.v. een cookie of zoiets aangezien je toch elke keer een nieuwe maakt.
Victor X op 08/05/2011 10:53:21:
@Kees, ik maak gewoon op elke pagina die hash opniew aan, zodat je niet met elke page view een extra query krijgt.
Waarom zou je dit willen? Je voert elke keer weer een nieuwe (onnodige) query uit. Je kunt overigens ook niet kijken of die hash klopt d.m.v. een cookie of zoiets aangezien je toch elke keer een nieuwe maakt.
Je kan het ook nog combineren. Je hash opslaan in de database(ongecodeerd), cookie(gecodeeerd) en in de session(gecodeerd) en dan steeds de salt uit de database halen en daarmee blijven verifiëren. Dit gaat wel voor wat extra laadtijd zorgen.
Ik snap zelf bijna niet meer wat ik heb geschreven ik hoop jullie wel. :D
Ik bedoel juist dat ik geen query uitvoer.
Ik heb in de session staan.
naam en hash
hash wordt gemaakt door sha1(naam.ip); dus dan kan hij niet zn naam veranderen in de sessie
en als ik kijk of hij ingelogt is, dan pak ik zijn naam uit de sessie, maak daar een hash van en kijk of dat overeenkomt met de sessie hash. en als hij dan zijn naam heeft veranderd, of de hash, klopt het niet meer.
snap je het nog? zo kost het redelijk weinig laadtijd omdat je geen query hoeft uit te voeren.