Login script (wat doe ik fout?)
In een oud topic heeft "ark" mijn login script verbeterd die ik toen had gemaakt: http://www.phphulp.nl/forum/showtopic.php?cat=1&id=63993&lasttopic=1
Nou heb ik deze alleen vertaald in het engels, meer niet.
Alleen, nou is mijn vraag. Hoe beveilig in mijn pagina waar ik naartoe redirect als ik ben ingelogd?
Want ik krijg het niet voor mekaar, ook niet door te googlen.
De checks doen het, het inloggen met md5 gaat goed en als het wachtwoord niet goed is word dat vermeld.
login_form:
<FORM ACTION = "login_sql.php" METHOD = "post">
Username: <INPUT TYPE = "text" NAME = "username" /><br />
Password: <INPUT TYPE = "text" NAME = "password" /><br />
<INPUT TYPE = "submit" VALUE = "Log in" />
</FORM>
login_sql
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
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
<?php
include 'connect_db.php';
// Check login name.
if(isset($_POST['username']) && !empty ($_POST['username']))
{
// Check password.
if(isset($_POST['password']) && !empty ($_POST['password']))
{
// Execute query.
$Query =
"
SELECT
id
FROM
members
WHERE
username = '".mysql_real_escape_string($_POST['username'])."'
AND
password = '".md5($_POST['password'])."'
";
// Store query.
$Result = mysql_query($Query);
// Checks the query.
if(!$Result)
{
echo 'Error in query, '.$Query.'';
}
else
{
// Check if there is a result.
if(mysql_num_rows($Result) !== 0)
{
// Make session.
$Row = mysql_fetch_assoc($Result);
$_SESSION['user_id'] = $Rij['id'];
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
// Redirect.
header('location: index.php');
}
else
{
// No result.
echo 'No results found in database';
}
}
}
else
{
echo 'Enter you password!';
}
}
else
{
echo 'Enter your username!';
}
?>
include 'connect_db.php';
// Check login name.
if(isset($_POST['username']) && !empty ($_POST['username']))
{
// Check password.
if(isset($_POST['password']) && !empty ($_POST['password']))
{
// Execute query.
$Query =
"
SELECT
id
FROM
members
WHERE
username = '".mysql_real_escape_string($_POST['username'])."'
AND
password = '".md5($_POST['password'])."'
";
// Store query.
$Result = mysql_query($Query);
// Checks the query.
if(!$Result)
{
echo 'Error in query, '.$Query.'';
}
else
{
// Check if there is a result.
if(mysql_num_rows($Result) !== 0)
{
// Make session.
$Row = mysql_fetch_assoc($Result);
$_SESSION['user_id'] = $Rij['id'];
$_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
// Redirect.
header('location: index.php');
}
else
{
// No result.
echo 'No results found in database';
}
}
}
else
{
echo 'Enter you password!';
}
}
else
{
echo 'Enter your username!';
}
?>
index:
En moet $rij niet $row worden?
Is er verder nog wat aan te merken op het script wat beter zou kunnen?
- Ik gebruik zelf altijd SERVER_REQUEST_METHOD = "post" ipv isset($_POST)
- Ik weet niet of je bekend met met OOP maar je kunt het beter prepared statements gebruiken in je mysql queries om sql injections en hackend tuig te voorkomen.
- Wellicht een logout link maken die wijst naar een session_destroy script.
- Wat meer security dan alleen md5? Ik gebruik zelf md5 + sha1 maar je kunt ook andere sha's gebruiken als je die geïnstalleerd hebt ( check php_info() )
- Wellicht je password's 'salten'? Zoek maar s op Google. Dit om rainbow table attacks te voorkomen, ik zou dan gaan voor een unieke 'salt' voor elk wachtwoord wat je db in gaat. Dit in combinatie met MD5 en SHA1 is redelijk secure lijkt me :)
Maar goed, het hangt ervan af hoe zwaar je db gebruikt gaat worden, hoeveel mensen het gaan gebruiken etc.
Succes!