[PHP LOGIN] Veilige manier.
Maar die dag was ik nogal, Pissig....
En ik heb tegen een paar mensen uitgevlogen, hiervoor wil ik me alvast voor verontschuldigen.
Maar nu hebben ze gezegd, dat mijn login systeem, heel slecht was.
Nu vraag ik mij af, wat is de goede manier hier voor?
Kan iemand mij een Code tonen van een goede login & Er informatie bij geven.
Waarom dit precies veiliger is?
Alvast bedankt, groetjes paco.
Quote:
Maar die dag was ik nogal, Pissig....
Dat is iedereen wel eens.
Quote:
Maar nu hebben ze gezegd, dat mijn login systeem, heel slecht was.
Ik ben je gisteren niet tegen gekomen, dus mijn vraag is: Kan je de specifieke code plaatsen?
Gr
:EDIT
Ik lees je topic / code van gisteren en geef iedereen gelijk.... Ik zal even een heel basic login script voor je schrijven met de benodigde commentaar en bij. Je zult nog wel zelf een aantal dingen moeten lezen, en bepaalde functies van PHP moeten implementeren.
Maar eerst even een kopje koffie. Totzo
Gewijzigd op 30/08/2010 18:58:07 door Niels K
Ik heb toevallig net wat geschreven voor een eigen site misschien kun je er wat mee, heb even wat comments voor je toegevoegd.
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
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
<?php
/*
Gebruikers
- id
- gebruikersnaam
- wachtwoord
(Kan je zelf verder uitbreiden, dit is nodig)
*/
# Sessie starten
session_start
# Pagina includen
include('config.php');
# Als er op submit is gedrukt.
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
# Als er gebruikersnaam & Wachtwoord is ingevult
if( isset( $_POST['gebruikersnaam'] ) && isset( $_POST['wachtwoord'] ) )
{
# Gebruiker uit de database halen (Query nummer 1)
$qry = "SELECT
id,
gebruikersnaam,
wachtwoord
FROM
gebruikers
WHERE
gebruikersnaam = '".mysql_real_escape_string( $_POST['gebruikersnaam'] )."'
AND
wachtwoord = '".mysql_real_escape_string( md5( $_POST['wachtwoord'] ) )."'";
# Als query gelukt is
if( $sql = mysql_query( $qry ) )
{
# Als er resultaten zijn
if( mysql_num_rows($sql) > 0 )
{
# Record variabel aanmaken voor sessie.
$rec = mysql_fetch_assoc( $sql );
# Sessie's zetten
$_SESSION['userid'] = $rec['id'];
# Zeggen dat inloggen is gelukt
echo 'U bent succesvol ingelogt.';
# Doorsturen naar zelfgekozen pagina
header('refresh: 2; URL=ZETHIERJOUWPAGINA.php');
}
else
{
# Geen resultaten error
echo 'Er zijn geen gebruikers gevonden met deze gebruikersnaam / wachtwoord combinatie.';
}
}
else
{
# Fout in de query
echo 'Er is een fout opgetreden in de query [1].';
}
}
else
{
# Geen gebruikersnaam of wachtwoord error.
echo 'U heeft geen gebruikersnaam of wachtwoord ingevult.';
}
}
else
{
# Formulier weergeven.
echo '
<form action="" method="post">
<label>Gebruikersnaam:</label>
<input name="gebruikersnaam" type="text" />
<label>Wachtwoord</label>
<input name="wachtwoord" type="password" />
<input type="submit" value="Log in" />
</form>';
}
?>
/*
Gebruikers
- id
- gebruikersnaam
- wachtwoord
(Kan je zelf verder uitbreiden, dit is nodig)
*/
# Sessie starten
session_start
# Pagina includen
include('config.php');
# Als er op submit is gedrukt.
if( $_SERVER['REQUEST_METHOD'] == 'POST' )
{
# Als er gebruikersnaam & Wachtwoord is ingevult
if( isset( $_POST['gebruikersnaam'] ) && isset( $_POST['wachtwoord'] ) )
{
# Gebruiker uit de database halen (Query nummer 1)
$qry = "SELECT
id,
gebruikersnaam,
wachtwoord
FROM
gebruikers
WHERE
gebruikersnaam = '".mysql_real_escape_string( $_POST['gebruikersnaam'] )."'
AND
wachtwoord = '".mysql_real_escape_string( md5( $_POST['wachtwoord'] ) )."'";
# Als query gelukt is
if( $sql = mysql_query( $qry ) )
{
# Als er resultaten zijn
if( mysql_num_rows($sql) > 0 )
{
# Record variabel aanmaken voor sessie.
$rec = mysql_fetch_assoc( $sql );
# Sessie's zetten
$_SESSION['userid'] = $rec['id'];
# Zeggen dat inloggen is gelukt
echo 'U bent succesvol ingelogt.';
# Doorsturen naar zelfgekozen pagina
header('refresh: 2; URL=ZETHIERJOUWPAGINA.php');
}
else
{
# Geen resultaten error
echo 'Er zijn geen gebruikers gevonden met deze gebruikersnaam / wachtwoord combinatie.';
}
}
else
{
# Fout in de query
echo 'Er is een fout opgetreden in de query [1].';
}
}
else
{
# Geen gebruikersnaam of wachtwoord error.
echo 'U heeft geen gebruikersnaam of wachtwoord ingevult.';
}
}
else
{
# Formulier weergeven.
echo '
<form action="" method="post">
<label>Gebruikersnaam:</label>
<input name="gebruikersnaam" type="text" />
<label>Wachtwoord</label>
<input name="wachtwoord" type="password" />
<input type="submit" value="Log in" />
</form>';
}
?>
Als niels nog wat advies heeft, gewoon opvolgen hij heeft volgens mij wat meer ervaring dan ik heb ;).
Gewijzigd op 30/08/2010 19:17:33 door Milo S
Ziet er toch aardig uit zo, mis alleen bij de isset van de $_POST nog wat controles/validaties
Je zou ze natuurlijk ook per $_POST kunnen checken om je foutmelding gedetailleerder te krijgen maar dit vind ik persoonlijk niet nodig. U kunt dat natuurlijk wel doen ;).
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
# Als er WEL gebruikersnaam is ingevult
if( isset( $_POST['gebruikersnaam'] ) )
{
# Als er WEL wachtwoord is ingevult
if( isset( $_POST['wachtwoord'] ) )
{
/*
Hier plaats je dan regel 22 t/m 63
*/
}
else
{
# Geen wachtwoord
echo 'U bent vergeten een wachtwoord in te vullen.';
}
}
else
{
# Geen gebruikersnaam
echo 'U bent vergeten een gebruikersnaam in te vullen.';
}
?>
# Als er WEL gebruikersnaam is ingevult
if( isset( $_POST['gebruikersnaam'] ) )
{
# Als er WEL wachtwoord is ingevult
if( isset( $_POST['wachtwoord'] ) )
{
/*
Hier plaats je dan regel 22 t/m 63
*/
}
else
{
# Geen wachtwoord
echo 'U bent vergeten een wachtwoord in te vullen.';
}
}
else
{
# Geen gebruikersnaam
echo 'U bent vergeten een gebruikersnaam in te vullen.';
}
?>
Gewijzigd op 30/08/2010 19:22:20 door Milo S
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
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
<?php
// Database connectie importeren, deze file moet je nog wel aanmaken
require_once 'db_connect.php';
// Array voor alle foutmeldingen
$aErrors = array( );
// Kijken of de pagina zichzelf heeft aangeroepen en dat alle $_POST variablen zijn gezet. LET OP: Dit behoor je voortaan bij elk formulier afhandeling zo te doen
if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['username'], $_POST['password'] ) )
{
// Controleren of er een geldige gebruikersnaam is ingevoerd, Controles kan je natuurlijk uitbreiden met de functies: trim, strlen .. etc, nu even simpel
// Denk ook aan preg_match. Bij registratie kun je afdwingen om een 'sterke' naam te kiezen
if( !isset( $_POST['username'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldige naam ingevoerd';
}
// Controleren of er een geldig wachtwoord is ingevoerd, hier kun je ook gebruik maken van strlen om zo bepalen hoe groot een wachtwoord moet wezen
// PS: Regex is uit mijn hoofd, dus weet niet zeker of hij klopt
if( !preg_match( '#\A([a-z]*[0-9]){2,}[a-z]*\z#i', $_POST['password'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldig wachtwoord ingevoerd';
}
// Controle uitvoeren of er foutmeldingen zijn opgetreden
if( count( $aErrors ) == 0 )
{
// Query maken, en aan de database vragen of hij dezelfde gegevens kan vinden
$aQuery =
"
SELECT
user_id,
user_name,
user_password
FROM
users
WHERE
user_name = '" .mysql_real_escape_string( $_POST['username'] ). "'
AND
user_password = '" .mysql_real_escape_string( sha1( $_POST['password'] ) ). "'
";
// Query uitvoeren
$result = mysql_query( $aQuery );
// Controleren of query gelukt is
if( !$result )
{
$aErrors[] = 'Er is een fout opgetreden bij het uitvoeren van een query';
}
else
{
// Gegevens komen overeen..
// Je kunt nu rest van de functies uitvoeren. Nog even over sessies. Je kunt suberglobal gebruiken.
// session_register komt uit 19 noach...
voorbeeld: $_SESSION['user_id'] = $datawatgefetchtis['user_id'];
}
}
}
?>
// Database connectie importeren, deze file moet je nog wel aanmaken
require_once 'db_connect.php';
// Array voor alle foutmeldingen
$aErrors = array( );
// Kijken of de pagina zichzelf heeft aangeroepen en dat alle $_POST variablen zijn gezet. LET OP: Dit behoor je voortaan bij elk formulier afhandeling zo te doen
if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['username'], $_POST['password'] ) )
{
// Controleren of er een geldige gebruikersnaam is ingevoerd, Controles kan je natuurlijk uitbreiden met de functies: trim, strlen .. etc, nu even simpel
// Denk ook aan preg_match. Bij registratie kun je afdwingen om een 'sterke' naam te kiezen
if( !isset( $_POST['username'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldige naam ingevoerd';
}
// Controleren of er een geldig wachtwoord is ingevoerd, hier kun je ook gebruik maken van strlen om zo bepalen hoe groot een wachtwoord moet wezen
// PS: Regex is uit mijn hoofd, dus weet niet zeker of hij klopt
if( !preg_match( '#\A([a-z]*[0-9]){2,}[a-z]*\z#i', $_POST['password'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldig wachtwoord ingevoerd';
}
// Controle uitvoeren of er foutmeldingen zijn opgetreden
if( count( $aErrors ) == 0 )
{
// Query maken, en aan de database vragen of hij dezelfde gegevens kan vinden
$aQuery =
"
SELECT
user_id,
user_name,
user_password
FROM
users
WHERE
user_name = '" .mysql_real_escape_string( $_POST['username'] ). "'
AND
user_password = '" .mysql_real_escape_string( sha1( $_POST['password'] ) ). "'
";
// Query uitvoeren
$result = mysql_query( $aQuery );
// Controleren of query gelukt is
if( !$result )
{
$aErrors[] = 'Er is een fout opgetreden bij het uitvoeren van een query';
}
else
{
// Gegevens komen overeen..
// Je kunt nu rest van de functies uitvoeren. Nog even over sessies. Je kunt suberglobal gebruiken.
// session_register komt uit 19 noach...
voorbeeld: $_SESSION['user_id'] = $datawatgefetchtis['user_id'];
}
}
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title> Login script .. BETA (a) </title>
</head>
<body>
<form method="POST" action="" />
<table>
<tr>
<td> Username </td><td><input type="text" name="username" /></td>
</tr>
<tr>
<td> Password </td><td><input type="password" name="password" /></td>
</tr>
</table>
</form>
</body>
</html>
<head>
<title> Login script .. BETA (a) </title>
</head>
<body>
<form method="POST" action="" />
<table>
<tr>
<td> Username </td><td><input type="text" name="username" /></td>
</tr>
<tr>
<td> Password </td><td><input type="password" name="password" /></td>
</tr>
</table>
</form>
</body>
</html>
Zo even wat code naar je hoofd geslingerd.. Lees goed de commentaar regels.
Om goed een formulier te valideren kan je gebruik maken de ctype functies: Hier weergegeven:
- ctype_digit
- ctype_ alnum
- ctype_ alpha
- ctype_ cntrl
- ctype_ digit
- ctype_ graph
- ctype_ lower
- ctype_ print
- ctype_ punct
- ctype_ space
- ctype_ upper
- ctype_ xdigit
Als je er op klikt, kom je op de documentatie pagina van PHP. De functie wordt daar dan uitgebreid uitgelegd aan de hand van tekst en een aantal voorbeelden.
Verder is het gebruik van preg_match ook belangrijk om je form te valideren.
Om te kijken of een pagina zichzelf heeft aangeroepen gebruiken wij:
Verder zie je dat ik gebruik maak van de functie mysql_real_escape_string, dit is om SQL injection tegen te gaan.
Ook is het heel belangrijk om aan fouten afhandeling te doen. Probeer hier dus niet de begrafenisondernemer uit te hangen met de kerkhof methodes ( OR DIE ) maar maak gebruik van een goede if / else structuur.
Verder zoals gisteren al duidelijk is gemaakt is session_register al heeel oud. Het gebruik van de superglobal $_SESSION wordt aangeraden.
Tot slot is moet het fijn zijn om code van jouw te lezen voor andere programmeurs. Programmeer dus overzichtelijk, en zorg voor het nodige commentaar in je code.
EDIT:
Nog een paar tips voor beveiliging:
- Maak gebruik van een salt
- Maak gebruik van tokens
- XSS injection
Gewijzigd op 30/08/2010 19:34:08 door Niels K
Code (php)
Als je dan alles binnen de tekens daaronder plakt moet het werken. Anders zet je wel allemaal errors in een array maar laat je ze voor de rest gewoon zitten.
Verder niet onder regel 60, maar onder regel 61 of onder het formulier even php openen code erin gooien en sluiten.
Gewijzigd op 30/08/2010 20:26:17 door Niels K
dat login ding wat je daar neer zet.. Wat k niet snap hoe jij weet of de authenticatie gelukt is?
Je Query ziet er goed uit, en die mislukt dus nooit. Ook als de user credits WEL goed zijn. Je vergeet het aantal rows te checken, niet? ;-)
Verder is het escapen (mysql_real_escape_string()) van een sha1() hash niet nodig: een sha1() hash kan immers nooit dergelijke karakters bevatten. Maar ach, het kan ook geen kwaad.
Edit:
Het grootste probleem is dus de if(mysql_num_rows(...) === 1) die je vergeten bent. (of hoe je dat dan ook wil checken, zijn meerdere manieren voor natuurlijk)
Gewijzigd op 30/08/2010 21:04:38 door niek s
Quote:
dat login ding wat je daar neer zet.. Wat k niet snap hoe jij weet of de authenticatie gelukt is?
Na je edit snapte ik je pas:)
Maar ik schreef:
En uiteraard bedoelde ik de check die jij voorschrijft. Maar ik zei ook aan het begin dat hij zelf ook dingen moest uitvoeren. Ik was hem niet vergeten, integendeel het was expres gedaan. Maar ik snap dat je dacht dat ik het vergeten was want ik deel leg het niet goed uit. Ik zal de tekst iets aanpassen.
Gewijzigd op 30/08/2010 21:16:32 door Niels K
Gewijzigd op 30/08/2010 22:12:00 door Pim -
---------------
Quote:
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
session_start();
class Login{
private $dbhost = 'localhost';
private $dbname = 'name';
private $dbuser = 'user';
private $dbpass = '****';
private $usertable = 'usertable';
private $connect;
private $result_to;
private $data;
public $dbresponse;
public $response;
public function __construct(){
$this->connect = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
if(!$this->connect){
echo "<h4>Kan geen connectie maken met de database, kijk je gegevens even na.</h4>";
}else{
mysql_select_db($this->dbname);
//echo "<h4>Perfect geconnecteerd.</h4>";
}
}
public function __destruct() {
mysql_close($this->connect);
}
public function query_execute($query){
$this->result_to = mysql_query($query);
if(!$this->result_to){
echo '<h4>query kon niet worden uitgevoerd</h4';
}else{
return $this->result_to;
}
}
public function fetch_data($result){
if(!$result){
$rows = NULL;
}else{
$row = mysql_fetch_array($result);
return $row;
}
}
public function login_user($username, $password){
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$password = md5($password);
$sql = "SELECT username,password FROM clients WHERE username = '$username' AND password = '$password' limit 1";
$result = $this->query_execute($sql);
$this->data = $this->fetch_data($result);
if(!$this->data){
return 'Voer alstublief de correcte gegevens in.';
}else{
$_SESSION['username'] = $this->data['username'];
$_SESSION['permission'] = 'yes';
header('location: securearea.php');
//echo $_SESSION['username'];
}
}
public function logout(){
/*
if(isset($_SESSION['permission'])) {
unset($_SESSION['permission']);
if(isset($_COOKIE[session_name()]))
setcookie(session_name(), '', time() - 1000);
session_destroy();
}
* */
session_destroy();
return 'U bent uitgelogd';
}
public function session_check() {
echo $_SESSION['username'];
if($_SESSION['permission'] != 'yes') {
// header("location: index.php");
return 'U hebt niet de bevoegdheden om deze pagina te bezichtigen';
}else{
//header("location: securearea.php");
return 'U bent ingelogd';
}
}
}
?>
session_start();
class Login{
private $dbhost = 'localhost';
private $dbname = 'name';
private $dbuser = 'user';
private $dbpass = '****';
private $usertable = 'usertable';
private $connect;
private $result_to;
private $data;
public $dbresponse;
public $response;
public function __construct(){
$this->connect = mysql_connect($this->dbhost, $this->dbuser, $this->dbpass);
if(!$this->connect){
echo "<h4>Kan geen connectie maken met de database, kijk je gegevens even na.</h4>";
}else{
mysql_select_db($this->dbname);
//echo "<h4>Perfect geconnecteerd.</h4>";
}
}
public function __destruct() {
mysql_close($this->connect);
}
public function query_execute($query){
$this->result_to = mysql_query($query);
if(!$this->result_to){
echo '<h4>query kon niet worden uitgevoerd</h4';
}else{
return $this->result_to;
}
}
public function fetch_data($result){
if(!$result){
$rows = NULL;
}else{
$row = mysql_fetch_array($result);
return $row;
}
}
public function login_user($username, $password){
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$password = md5($password);
$sql = "SELECT username,password FROM clients WHERE username = '$username' AND password = '$password' limit 1";
$result = $this->query_execute($sql);
$this->data = $this->fetch_data($result);
if(!$this->data){
return 'Voer alstublief de correcte gegevens in.';
}else{
$_SESSION['username'] = $this->data['username'];
$_SESSION['permission'] = 'yes';
header('location: securearea.php');
//echo $_SESSION['username'];
}
}
public function logout(){
/*
if(isset($_SESSION['permission'])) {
unset($_SESSION['permission']);
if(isset($_COOKIE[session_name()]))
setcookie(session_name(), '', time() - 1000);
session_destroy();
}
* */
session_destroy();
return 'U bent uitgelogd';
}
public function session_check() {
echo $_SESSION['username'];
if($_SESSION['permission'] != 'yes') {
// header("location: index.php");
return 'U hebt niet de bevoegdheden om deze pagina te bezichtigen';
}else{
//header("location: securearea.php");
return 'U bent ingelogd';
}
}
}
?>
securearea.php
--------------
Quote:
<p>
Hier zitten de veilige dingen!
</p>
<a href="voorbeeld.php?val=0">uitloggen</a>
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
include_once 'login.class.php';
$securearea = new Login();
$response = $securearea->session_check();
?>
include_once 'login.class.php';
$securearea = new Login();
$response = $securearea->session_check();
?>
<p>
Hier zitten de veilige dingen!
</p>
<a href="voorbeeld.php?val=0">uitloggen</a>
voorbeeld.php
-------------
Quote:
<form action="sample.php" method="POST">
username : <input name = "username" type="text" /><br/>
password : <input name = "password" type ="password" /><br/>
<input name ="submit" type ="submit" value ="login" />
</form>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
include_once 'login.class.php';
$obj = new Login();
if(isset($_GET['val']) && $_GET['val'] == '0') {
$obj->logout();
}
if(isset ($_POST[submit])) {
$response = $obj->login_user($_POST['username'],$_POST['username']);
}
?>
include_once 'login.class.php';
$obj = new Login();
if(isset($_GET['val']) && $_GET['val'] == '0') {
$obj->logout();
}
if(isset ($_POST[submit])) {
$response = $obj->login_user($_POST['username'],$_POST['username']);
}
?>
<form action="sample.php" method="POST">
username : <input name = "username" type="text" /><br/>
password : <input name = "password" type ="password" /><br/>
<input name ="submit" type ="submit" value ="login" />
</form>
Misschien kan je hier wel wat mee :)
Groeten!
Niels Kieviet op 30/08/2010 19:29:44:
Zo even wat code naar je hoofd geslingerd.. Lees goed de commentaar regels.
Om goed een formulier te valideren kan je gebruik maken de ctype functies: Hier weergegeven:
- ctype_digit
- ctype_ alnum
- ctype_ alpha
- ctype_ cntrl
- ctype_ digit
- ctype_ graph
- ctype_ lower
- ctype_ print
- ctype_ punct
- ctype_ space
- ctype_ upper
- ctype_ xdigit
Als je er op klikt, kom je op de documentatie pagina van PHP. De functie wordt daar dan uitgebreid uitgelegd aan de hand van tekst en een aantal voorbeelden.
Verder is het gebruik van preg_match ook belangrijk om je form te valideren.
Om te kijken of een pagina zichzelf heeft aangeroepen gebruiken wij:
Verder zie je dat ik gebruik maak van de functie mysql_real_escape_string, dit is om SQL injection tegen te gaan.
Ook is het heel belangrijk om aan fouten afhandeling te doen. Probeer hier dus niet de begrafenisondernemer uit te hangen met de kerkhof methodes ( OR DIE ) maar maak gebruik van een goede if / else structuur.
Verder zoals gisteren al duidelijk is gemaakt is session_register al heeel oud. Het gebruik van de superglobal $_SESSION wordt aangeraden.
Tot slot is moet het fijn zijn om code van jouw te lezen voor andere programmeurs. Programmeer dus overzichtelijk, en zorg voor het nodige commentaar in je code.
EDIT:
Nog een paar tips voor beveiliging:
- Maak gebruik van een salt
- Maak gebruik van tokens
- XSS injection
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
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
<?php
// Database connectie importeren, deze file moet je nog wel aanmaken
require_once 'db_connect.php';
// Array voor alle foutmeldingen
$aErrors = array( );
// Kijken of de pagina zichzelf heeft aangeroepen en dat alle $_POST variablen zijn gezet. LET OP: Dit behoor je voortaan bij elk formulier afhandeling zo te doen
if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['username'], $_POST['password'] ) )
{
// Controleren of er een geldige gebruikersnaam is ingevoerd, Controles kan je natuurlijk uitbreiden met de functies: trim, strlen .. etc, nu even simpel
// Denk ook aan preg_match. Bij registratie kun je afdwingen om een 'sterke' naam te kiezen
if( !isset( $_POST['username'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldige naam ingevoerd';
}
// Controleren of er een geldig wachtwoord is ingevoerd, hier kun je ook gebruik maken van strlen om zo bepalen hoe groot een wachtwoord moet wezen
// PS: Regex is uit mijn hoofd, dus weet niet zeker of hij klopt
if( !preg_match( '#\A([a-z]*[0-9]){2,}[a-z]*\z#i', $_POST['password'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldig wachtwoord ingevoerd';
}
// Controle uitvoeren of er foutmeldingen zijn opgetreden
if( count( $aErrors ) == 0 )
{
// Query maken, en aan de database vragen of hij dezelfde gegevens kan vinden
$aQuery =
"
SELECT
user_id,
user_name,
user_password
FROM
users
WHERE
user_name = '" .mysql_real_escape_string( $_POST['username'] ). "'
AND
user_password = '" .mysql_real_escape_string( sha1( $_POST['password'] ) ). "'
";
// Query uitvoeren
$result = mysql_query( $aQuery );
// Controleren of query gelukt is
if( !$result )
{
$aErrors[] = 'Er is een fout opgetreden bij het uitvoeren van een query';
}
else
{
// Gegevens komen overeen..
// Je kunt nu rest van de functies uitvoeren. Nog even over sessies. Je kunt suberglobal gebruiken.
// session_register komt uit 19 noach...
voorbeeld: $_SESSION['user_id'] = $datawatgefetchtis['user_id'];
}
}
}
?>
// Database connectie importeren, deze file moet je nog wel aanmaken
require_once 'db_connect.php';
// Array voor alle foutmeldingen
$aErrors = array( );
// Kijken of de pagina zichzelf heeft aangeroepen en dat alle $_POST variablen zijn gezet. LET OP: Dit behoor je voortaan bij elk formulier afhandeling zo te doen
if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['username'], $_POST['password'] ) )
{
// Controleren of er een geldige gebruikersnaam is ingevoerd, Controles kan je natuurlijk uitbreiden met de functies: trim, strlen .. etc, nu even simpel
// Denk ook aan preg_match. Bij registratie kun je afdwingen om een 'sterke' naam te kiezen
if( !isset( $_POST['username'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldige naam ingevoerd';
}
// Controleren of er een geldig wachtwoord is ingevoerd, hier kun je ook gebruik maken van strlen om zo bepalen hoe groot een wachtwoord moet wezen
// PS: Regex is uit mijn hoofd, dus weet niet zeker of hij klopt
if( !preg_match( '#\A([a-z]*[0-9]){2,}[a-z]*\z#i', $_POST['password'] ) )
{
// Foutmelding toevoegen aan array
$aErrors[] = 'Geen geldig wachtwoord ingevoerd';
}
// Controle uitvoeren of er foutmeldingen zijn opgetreden
if( count( $aErrors ) == 0 )
{
// Query maken, en aan de database vragen of hij dezelfde gegevens kan vinden
$aQuery =
"
SELECT
user_id,
user_name,
user_password
FROM
users
WHERE
user_name = '" .mysql_real_escape_string( $_POST['username'] ). "'
AND
user_password = '" .mysql_real_escape_string( sha1( $_POST['password'] ) ). "'
";
// Query uitvoeren
$result = mysql_query( $aQuery );
// Controleren of query gelukt is
if( !$result )
{
$aErrors[] = 'Er is een fout opgetreden bij het uitvoeren van een query';
}
else
{
// Gegevens komen overeen..
// Je kunt nu rest van de functies uitvoeren. Nog even over sessies. Je kunt suberglobal gebruiken.
// session_register komt uit 19 noach...
voorbeeld: $_SESSION['user_id'] = $datawatgefetchtis['user_id'];
}
}
}
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<title> Login script .. BETA (a) </title>
</head>
<body>
<form method="POST" action="" />
<table>
<tr>
<td> Username </td><td><input type="text" name="username" /></td>
</tr>
<tr>
<td> Password </td><td><input type="password" name="password" /></td>
</tr>
</table>
</form>
</body>
</html>
<head>
<title> Login script .. BETA (a) </title>
</head>
<body>
<form method="POST" action="" />
<table>
<tr>
<td> Username </td><td><input type="text" name="username" /></td>
</tr>
<tr>
<td> Password </td><td><input type="password" name="password" /></td>
</tr>
</table>
</form>
</body>
</html>
Zo even wat code naar je hoofd geslingerd.. Lees goed de commentaar regels.
Om goed een formulier te valideren kan je gebruik maken de ctype functies: Hier weergegeven:
- ctype_digit
- ctype_ alnum
- ctype_ alpha
- ctype_ cntrl
- ctype_ digit
- ctype_ graph
- ctype_ lower
- ctype_ print
- ctype_ punct
- ctype_ space
- ctype_ upper
- ctype_ xdigit
Als je er op klikt, kom je op de documentatie pagina van PHP. De functie wordt daar dan uitgebreid uitgelegd aan de hand van tekst en een aantal voorbeelden.
Verder is het gebruik van preg_match ook belangrijk om je form te valideren.
Om te kijken of een pagina zichzelf heeft aangeroepen gebruiken wij:
Verder zie je dat ik gebruik maak van de functie mysql_real_escape_string, dit is om SQL injection tegen te gaan.
Ook is het heel belangrijk om aan fouten afhandeling te doen. Probeer hier dus niet de begrafenisondernemer uit te hangen met de kerkhof methodes ( OR DIE ) maar maak gebruik van een goede if / else structuur.
Verder zoals gisteren al duidelijk is gemaakt is session_register al heeel oud. Het gebruik van de superglobal $_SESSION wordt aangeraden.
Tot slot is moet het fijn zijn om code van jouw te lezen voor andere programmeurs. Programmeer dus overzichtelijk, en zorg voor het nodige commentaar in je code.
EDIT:
Nog een paar tips voor beveiliging:
- Maak gebruik van een salt
- Maak gebruik van tokens
- XSS injection
Ik heb vraagje voor niels waarom
Code (php)
1
if( $_SERVER['REQUEST_METHOD'] == 'POST' && isset( $_POST['username'], $_POST['password'])){
En niet?
Door die && ertussen te zetten maak je er een expressie van:
PHP probeert eerst dat &&-statement uit te voeren, en daarbij pakt hij de waarden uit $_POST['username'] en $_POST['password'], ervan uitgaande dat die bestaan. Bestaan ze niet (hence isset) dan krijg je alsnog je notice.
het is inderdaat een goed idee om sessies en cookies te combineren dat is namelijk veiliger. ps leuk script verder