Login met php
Een 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
<!-- De login form -->
<div class="container mt-5">
<h3>Login</h3>
<form method="post" action"login.php" name="login">
<div class="form-group">
<label for="gebruikersnaam">Gebruikersnaam</label>
<input type="text" name="gebruikersnaam" class="form-control" aria-describedby="emailHelp" placeholder="Voer uw gebruikersnaam in">
</div>
<div class="form-group">
<label for="wachtwoord">Password</label>
<input type="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button name="submit" type="submit" value="login" class="btn btn-primary">Submit</button>
</form>
</div>
<div class="container mt-5">
<h3>Login</h3>
<form method="post" action"login.php" name="login">
<div class="form-group">
<label for="gebruikersnaam">Gebruikersnaam</label>
<input type="text" name="gebruikersnaam" class="form-control" aria-describedby="emailHelp" placeholder="Voer uw gebruikersnaam in">
</div>
<div class="form-group">
<label for="wachtwoord">Password</label>
<input type="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button name="submit" type="submit" value="login" class="btn btn-primary">Submit</button>
</form>
</div>
de sessie waar die naar toe gaat
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
require('config.php')
session_start();
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
?>
require('config.php')
session_start();
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
?>
Ik zal de stappen van een inlog-actie in stappen uitleggen:
- Controleer eerst of er ge-POST is met:
- controleer of de waardes zijn ingevuld
- Zorg dat je het wachtwoord hasht met password_hash, deze wil je NIET open en bloot opslaan!)
- controleer met password_verify of het wachtwoord klopt. Controleer tevens met mysqli_num_rows of de username klopt.
- Denk aan SQL-injection, en escape je username. Je wachtwoord is niet nodig, omdat die altijd gehashed zal zijn, en niet met een injection te forceren is.
- Profit: De ingevoerde gegevens komen overeen. Zorg ervoor dat je een sessie aanmaakt met bijvoorbeeld het ID-nummer van de gebruiker.
Verder is dit best een basaal voorbeeld, maar er zijn tal van andere dingen om het inloggen veiliger te maken, zoals session_regenerate_id om tussentijds je SessionID te veranderen om het kaper ervan onmogelijk te maken.
Gewijzigd op 24/05/2018 09:11:37 door - Ariën -
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
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Vereist config
require('config.php')
// Start de sessie
session_start();
// Variablen voor error bericht
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['username']) || empty($_POST['password']))
{
$error = "Username or Password is invalid";
}
else
{
// Globale variablen
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
// MySQl injectie beschermen
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
// Database selected
$db = mysql_select_db("studenten", $connection);
// Query van database uitlezing
$query = mysql_query("select * from studenten where password='$password' AND naam='$username'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1)
{
$_SESSION['login_user']=$username; // Sessie intialiseren
header("location: index.php"); // Redirecten naar andere pagina
} else {
$error = "Username or Password is invalid";
}
mysql_close($connection); // Connectie sluiten
}
}
?>
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Vereist config
require('config.php')
// Start de sessie
session_start();
// Variablen voor error bericht
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['username']) || empty($_POST['password']))
{
$error = "Username or Password is invalid";
}
else
{
// Globale variablen
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
// MySQl injectie beschermen
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
// Database selected
$db = mysql_select_db("studenten", $connection);
// Query van database uitlezing
$query = mysql_query("select * from studenten where password='$password' AND naam='$username'", $connection);
$rows = mysql_num_rows($query);
if ($rows == 1)
{
$_SESSION['login_user']=$username; // Sessie intialiseren
header("location: index.php"); // Redirecten naar andere pagina
} else {
$error = "Username or Password is invalid";
}
mysql_close($connection); // Connectie sluiten
}
}
?>
Gebruik liever MySQLi (makkelijker) of PDO (wat lastiger)
En lees ook mijn stappenplan, want dit inlogscript slaat wachtwoorden onbeveiligd op!!!!!!
Ik zou ook zeker een SSL-verbinding aanraden. Let's Encrypt is gratis, als je webhosting dat ondersteunt!
Gewijzigd op 24/05/2018 09:15:34 door - Ariën -
Zal ik zeker doen maar nu is het een beetje met spoed, omdat ik bezig ben met examen opdracht en login is waar ik vast loop vandaar.
Als het maar goed en veilig is gebouwd, dan komt alles goed!
Nou ben wel aan het stressen want het werkt niet en zie ook geen errors...
Gewijzigd op 24/05/2018 09:39:29 door - Ariën -
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
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
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Vereist config
require('config.php')
// Start de sessie
session_start();
// Variablen voor error bericht
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['username']) || empty($_POST['password']))
{
$error = "Username or Password is invalid";
}
else
{
// Globale variablen
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
// MySQl injectie beschermen
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);
$query = "SELECT * FROM 'studenten' WHERE naam='$username'
and password='$password'";
$result = mysqli_query($con,$query) or die(mysqli_error());
$rows = mysqli_num_rows($result);
if($rows==1){
$_SESSION['gebruikersnaam'] = $username;
// Redirect user to index.php
header("Location: index.php");
}
}
}
?>
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Vereist config
require('config.php')
// Start de sessie
session_start();
// Variablen voor error bericht
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['username']) || empty($_POST['password']))
{
$error = "Username or Password is invalid";
}
else
{
// Globale variablen
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
// MySQl injectie beschermen
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);
$query = "SELECT * FROM 'studenten' WHERE naam='$username'
and password='$password'";
$result = mysqli_query($con,$query) or die(mysqli_error());
$rows = mysqli_num_rows($result);
if($rows==1){
$_SESSION['gebruikersnaam'] = $username;
// Redirect user to index.php
header("Location: index.php");
}
}
}
?>
Gewijzigd op 24/05/2018 09:44:55 door - Ariën -
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
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
<?php
session_start()
?>
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
</head>
<body>
<!-- De login form -->
<div class="container mt-5">
<h3>Login</h3>
<form method="post" action"login.php" name="login">
<div class="form-group">
<label for="gebruikersnaam">Gebruikersnaam</label>
<input type="text" name="gebruikersnaam" class="form-control" aria-describedby="emailHelp" placeholder="Voer uw gebruikersnaam in">
</div>
<div class="form-group">
<label for="wachtwoord">Password</label>
<input type="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button name="submit" type="submit" value="login" class="btn btn-primary">Submit</button>
</form>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
</body>
</html>
session_start()
?>
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
</head>
<body>
<!-- De login form -->
<div class="container mt-5">
<h3>Login</h3>
<form method="post" action"login.php" name="login">
<div class="form-group">
<label for="gebruikersnaam">Gebruikersnaam</label>
<input type="text" name="gebruikersnaam" class="form-control" aria-describedby="emailHelp" placeholder="Voer uw gebruikersnaam in">
</div>
<div class="form-group">
<label for="wachtwoord">Password</label>
<input type="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<button name="submit" type="submit" value="login" class="btn btn-primary">Submit</button>
</form>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
</body>
</html>
Gewijzigd op 24/05/2018 09:59:07 door Izildo Pimentel
Gewijzigd op 24/05/2018 09:59:35 door - Ariën -
Is dat dan de reden dat ik niet kan inloggen?
Geef de query eens weer op het scherm, en knip en plak deze in een tool waarmee met je met je database kunt praten (phpMyAdmin of rechtstreeks in de console) en kijk of je resultaat krijgt?
Bouw wat breekpunten in of geef wat tekst weer op het scherm als in code aan bepaalde condities is voldaan zodat je weet welk pad de code kiest om uitgevoerd te worden, dit stuurt je mogelijk richting enige fout die aanwezig kan zijn.
Wat opmerkingen:
- na een header('Location: ...'); hoort meestal een exit; te staan, omdat het zelden tot nooit de bedoeling is dat er daarna nog code wordt uitgevoerd, een header stuurt je niet meteen automagisch naar de nieuwe locatie
- elke pagina waar je een sessie wilt starten of voort wil zetten dient altijd te beginnen met session_start(), daarna kun je $_SESSION gebruiken
- password is een gereserveerd woord in MySQL, als je deze in een query wilt gebruiken doe je er verstandig aan om deze kolom te omvatten met `backticks`, of wellicht beter, om een andere naam voor deze kolom te kiezen
- SQL-injectie voorkom je niet door stripslashes(), de enige veilige combinatie in deze opzet is gebruikmaking van de real_escape_string() functie/methode in combinatie met 'quotes', het een is niet veilig zonder het ander
Gewijzigd op 24/05/2018 10:04:33 door Thomas van den Heuvel
Ik zou eerder kijken wat er precies gebeurd, en welke stappen er wel en niet worden doorlopen.
Met andere woorden... debug je script eens door na elke gebeurtenis een echo te plaatsen, en kijk eens wat er precies gebeurd.
Je script is verder gezien de syntax correct.
Errors zou je ook moeten zien.
Gewijzigd op 24/05/2018 10:07:14 door - Ariën -
EDIT: bijvoorbeeld, als je na het verzenden van het loginformulier niet wordt doorgestuurd naar index.php houdt dit simpelweg in dat niet voldaan is aan de conditie dat er één resultaatrij voor de query was. Dat kan weer inhouden dat er géén resultaten waren, of méér dan één (staan er toevallig records dubbel in de logintabel?). Het is vaak een kwestie van uitzoeken waar het schip precies strandt, en dan terugwandelen om te zien waar deze precies op de rotsen liep :p.
Gewijzigd op 24/05/2018 10:13:23 door Thomas van den Heuvel
De error wijst je daarom altijd de weg, zolang je die maar ergens ziet of logt. (laatste is beter in de praktijk).
Is het goed dat ik name gebruik in mijn loginform? of moet dat een id zijn?
name en ID zijn twee verschillende dingen. Met name identificeert je een formulierveld voor formulierafhandelingen.
Gewijzigd op 24/05/2018 10:15:23 door - Ariën -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// declareren
function escape($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
function dump($array) {
?><pre><?php echo escape(print_r($array, true)); ?></pre><?php
}
// aanroepen
dump($_POST);
?>
// declareren
function escape($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
function dump($array) {
?><pre><?php echo escape(print_r($array, true)); ?></pre><?php
}
// aanroepen
dump($_POST);
?>
EDIT: controleer even het gebruik van $_POST['username'] (regel 15) versus $_POST['gebruikersnaam'] (regel 23), dat klopt niet helemaal.
Gewijzigd op 24/05/2018 10:29:35 door Thomas van den Heuvel
mijn code nu ik heb breaks gebruikt, boven aan een error check en jou functie erbij.
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
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
<?php
// Start de sessie
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Vereist config
require('config.php');
debugBreak(error);
// Variablen voor error bericht
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['gebruikersnaam']) || empty($_POST['password']))
{
$error = "Username or Password is invalid";
}
else
{
// Globale variablen
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
// MySQl injectie beschermen
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);
// Select de database
$db = msqli_select_db($msqli, "studenten");
debugBreak(error);
// Query selecten
$query = mysqli_query($mysqli, "SELECT * FROM 'studenten' WHERE naam='$username'
AND password='$password'");
debugBreak(error);
$rows = mysqli_num_rows($query);
if($rows == 1){
// Redirect user to index.php
header("Location: index.php");
exit();
}
else
{
$error = "credentials not good";
}
mysqli_close($mysqli);
}
}
?>
<?php
// declareren
function escape($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
function dump($array) {
?><pre><?php echo escape(print_r($array, true)); ?></pre><?php
}
// aanroepen
dump($_POST);
?>
// Start de sessie
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
// Vereist config
require('config.php');
debugBreak(error);
// Variablen voor error bericht
$error=''; // Variable To Store Error Message
if (isset($_POST['submit'])) {
if (empty($_POST['gebruikersnaam']) || empty($_POST['password']))
{
$error = "Username or Password is invalid";
}
else
{
// Globale variablen
$username = trim($_POST['gebruikersnaam']);
$password = trim($_POST['password']);
// MySQl injectie beschermen
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);
// Select de database
$db = msqli_select_db($msqli, "studenten");
debugBreak(error);
// Query selecten
$query = mysqli_query($mysqli, "SELECT * FROM 'studenten' WHERE naam='$username'
AND password='$password'");
debugBreak(error);
$rows = mysqli_num_rows($query);
if($rows == 1){
// Redirect user to index.php
header("Location: index.php");
exit();
}
else
{
$error = "credentials not good";
}
mysqli_close($mysqli);
}
}
?>
<?php
// declareren
function escape($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
function dump($array) {
?><pre><?php echo escape(print_r($array, true)); ?></pre><?php
}
// aanroepen
dump($_POST);
?>