loginscript (veilig?)
Nou heb ik een tutorial gevolgd om een loginscript te maken, nou vroeg ik me af of het misschien nog beter beveiligd moet worden.
Het zijn de volgende files:
login_check.php:
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
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
<?php
$inlognaam = $_POST['inlognaam'];
$wachtwoord = $_POST['wachtwoord'];
if ($inlognaam&&$wachtwoord)
{
$connect = mysql_connect ("localhost","root","") or die ("Kan niet verbinden");
mysql_select_db ("test") or die ("Kan db niet vinden");
$inlognaam = stripslashes($inlognaam);
$wachtwoord = stripslashes($wachtwoord);
$inlognaam = mysql_real_escape_string($inlognaam);
$wachtwoord = mysql_real_escape_string($wachtwoord);
$query = mysql_query ("SELECT * FROM leden WHERE inlognaam='$inlognaam' AND wachtwoord='$wachtwoord'");
$numrows = mysql_num_rows ($query);
if ($numrows !=0)
{
session_register("inlognaam");
session_register("wachtwoord");
header("location:login_success.php");
}
else
die ("Inlognaam / Wachtwoord klopt niet!");
}
else
echo "Vul inlognaam en wachtwoord in!";
?>
$inlognaam = $_POST['inlognaam'];
$wachtwoord = $_POST['wachtwoord'];
if ($inlognaam&&$wachtwoord)
{
$connect = mysql_connect ("localhost","root","") or die ("Kan niet verbinden");
mysql_select_db ("test") or die ("Kan db niet vinden");
$inlognaam = stripslashes($inlognaam);
$wachtwoord = stripslashes($wachtwoord);
$inlognaam = mysql_real_escape_string($inlognaam);
$wachtwoord = mysql_real_escape_string($wachtwoord);
$query = mysql_query ("SELECT * FROM leden WHERE inlognaam='$inlognaam' AND wachtwoord='$wachtwoord'");
$numrows = mysql_num_rows ($query);
if ($numrows !=0)
{
session_register("inlognaam");
session_register("wachtwoord");
header("location:login_success.php");
}
else
die ("Inlognaam / Wachtwoord klopt niet!");
}
else
echo "Vul inlognaam en wachtwoord in!";
?>
login_succes.php:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
session_start();
if(!session_is_registered("inlognaam")){
header("location:login_form.php");
}
?>
session_start();
if(!session_is_registered("inlognaam")){
header("location:login_form.php");
}
?>
<html>
<body>
Ingelogd!<br/>
<a href=logout.php>Log out!</a>
</body>
</html>
Bedankt,
Wouter
- wachtwoord ongecodeerd in database, gebruik hash(),
- onnodige stripslashes,
- foutafhandeling ontbreekt,
- session_register en session_is_registered zijn verouderd, gebruik $_SESSION,
- de laatste regels van login_check.php kloppen niet: dubbele else.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
Eerst en vooral: je slaat je wachtwoorden zomaar op, niet gecodeerd. Leuk. Zo kan je de paswoorden van iedereen zomaar in de db zien.
paswoorden zet je ook nooit in een sessie.
Het paswoord heb je enkel nodig op het moment van het inloggen. Daarna laat je dat paswoord gerust.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
Als je goed zou inspringen zul je zien dat de eerste else nog van een if statement in de if statement komt. Desondanks klopt hij niet omdat je bij de 1-na-laatste else de brackets ( "{" en "}" ) vergeet!
edit:
* onnodig variabelen gaan definieren, je kan prima werken met post variabelen, en de stripslashes kun je tegelijk in de query toepassen.
* variabelen buiten quotes halen (bijv. in query)
* Mocht hash() je als beginner wat lastig lijken, kan je ook prima werken met md5($_POST['wachtwoord']) , alleen wees je ervan bewust dat er tegenwoordig databases worden bijgehouden met bekende md5 wachtwoorden, dus overweeg sha1 (iets minder bekend, maar ook daar als DB's voor), of dus gewoon wel de hash() functie
edit 2:
* Je moet zelf even wat onderzoek doen naar de goede combinatie van stripslashes & mysql_real_escape_string (ivm. magic quotes die soms aan en soms uit staan)
Gewijzigd op 01/01/1970 01:00:00 door Afra ca
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
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
<?PHP
/* Inlognaam check */
if(isset($_POST['inlognaam'] && !empty($_POST['inlognaam']))
{
/* Wachtwoord check */
if(isset($_POST['wachtwoord'] && !empty($_POST['wachtwoord']))
{
/* Query uitvoeren */
$Query =
"
SELECT
ID
FROM
tabel
WHERE
inlognaam = '".mysql_real_escape_string($_POST['inlognaam'])."'
AND
wachtwoord = '".md5($_POST['wachtwoord'])."'
";
/* Result */
$Result = mysql_query($Query);
/* Kijken of query is gelukt. */
if(!$Result)
{
echo 'Fout opgetreden met query, '.$Query.'';
}
else
{
/* Kijken of er een result is. */
if(mysql_num_rows($Result) !== 0)
{
/* Sessies aanmaken. */
$Rij = mysql_fetch_assoc($Result);
$_SESSION['USER_ID'] = $Rij['ID'];
$_SESSION['USER_IP'] = $_SERVER['REMOTE_ADDR'];
/* Doorsturen */
header('location: jouwpagina.php');
}
else
{
/* Geen result. */
echo 'Geen resultaat gevonden in database';
}
}
}
else
{
/* Geen wachtwoord ingevuld. */
echo 'Geen wachtwoord ingevuld.';
}
}
else
{
/* Geen inlognaam ingevuld. */
echo 'Geen inlognaam ingevuld.';
}
?>
/* Inlognaam check */
if(isset($_POST['inlognaam'] && !empty($_POST['inlognaam']))
{
/* Wachtwoord check */
if(isset($_POST['wachtwoord'] && !empty($_POST['wachtwoord']))
{
/* Query uitvoeren */
$Query =
"
SELECT
ID
FROM
tabel
WHERE
inlognaam = '".mysql_real_escape_string($_POST['inlognaam'])."'
AND
wachtwoord = '".md5($_POST['wachtwoord'])."'
";
/* Result */
$Result = mysql_query($Query);
/* Kijken of query is gelukt. */
if(!$Result)
{
echo 'Fout opgetreden met query, '.$Query.'';
}
else
{
/* Kijken of er een result is. */
if(mysql_num_rows($Result) !== 0)
{
/* Sessies aanmaken. */
$Rij = mysql_fetch_assoc($Result);
$_SESSION['USER_ID'] = $Rij['ID'];
$_SESSION['USER_IP'] = $_SERVER['REMOTE_ADDR'];
/* Doorsturen */
header('location: jouwpagina.php');
}
else
{
/* Geen result. */
echo 'Geen resultaat gevonden in database';
}
}
}
else
{
/* Geen wachtwoord ingevuld. */
echo 'Geen wachtwoord ingevuld.';
}
}
else
{
/* Geen inlognaam ingevuld. */
echo 'Geen inlognaam ingevuld.';
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Mr.Ark
Ziet er al beter uit, alleen waarom zou je het IP vanuit de database selecteren? Dat wil je niet. Als je het IP in een sessie wilt hebben (wat soms handig is), gebruik dan $_SERVER['REMOTE_ADDR'].
@Afra
Je kan md5 ook prima met hash() voor elkaar krijgen.
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
Je hebt gelijk, uit snelheid had ik daar niet bij nagedacht.
Zal het even verbeteren.
zeker, aangezien je bij hash als eerste parameter gewoon het algoritme kan aangeven. Maar denk dat
iets lastiger is dan
voor een beginner.
Gewijzigd op 01/01/1970 01:00:00 door Afra ca
Gewijzigd op 01/01/1970 01:00:00 door Mark PHP
Begrijp wel, de encryptie (ok, hash is officieel gezien geen encryptie) kan nog zo goed zijn, het gaat om de manier waarop het gebruikt wordt in een systeem. (evt. as easy as SQL INJECTION)
Ik vond het al heel wat dat ik begreep wat ik heb geschreven :), kennelijk komt er nog heel wat meer bij kijken.
@ark
Ook jij bedankt voor het herschrijven van het script, ik ga dit zeker gebruiken om te bestuderen.
Nogmaals bedankt,
Wouter
Dat heb ik nog nooit gebruikt, is dit veiliger?
Dus ik kom op 3 uit
en in het verbeterde script staan er maar 2
Ben ik nu mis of is dit topic uit 8 mei 2009?