PHP 2-Factor Autorisatie (2FA)
Pagina: « vorige 1 2 3 4 5 6 volgende »
Ik heb geprobeerd om het met hash te doen (password_hash($password, PASSWORD_DEFAULT)), maar toen kon ik ineens niet meer inloggen. Ik ga daar ook denk ik nog een topic over starten.
Toevoeging op 11/03/2019 19:47:20:
Maar nu heb ik weer hetzelfde probleem met het document die de gebruiker zou moeten inloggen, via 2FA.
Het document gaat eerst de ingevoerde code dehashen en daarna controleren. Zoja, dan wordt de gebruiker ingelogd via sessions. Maar, zoals "gebruikelijk", doen de sessions het dan niet...
Dit is de (volledige) code:
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
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
<?php
session_start();
require 'connection.inc.php';
if(!isset($_GET['request'])) {
if($_GET['request'] !== 'valid') {
header('../2FAVerify.php?error=invalidrequest');
exit();
}
}
else if(!isset($_POST['2FAVerifyCode'])) {
header('Location: ../2FAVerify.php?error=invalidrequest');
exit();
}
else if(empty($_POST['2FACode'])) {
header('Location: ../2FAVerify.php?request=valid&error=emptyfields');
exit();
}
else {
htmlspecialchars($code = $_POST['2FACode']);
htmlspecialchars($email = $_GET['email']);
$sql = 'SELECT * FROM autorisatie WHERE uid=?;';
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)) {
echo 'mysqli check statement voor uid is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
if($row = mysqli_fetch_assoc($result)) {
// code dehashen
$codeCheck = password_verify($code, $row['token']);
// controleren wel / niet goed
if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
// wel goed
else if ($codeCheck == true) {
// de records van autorisatie verwijderen
$sqlDelete = 'DELETE FROM autorisatie WHERE uid=?;';
$stmtDelete = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtDelete, $sqlDelete)) {
echo 'MYSQLI delete statement is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmtDelete, "s", $email);
mysqli_stmt_execute($stmtDelete);
$result = mysqli_stmt_get_result($stmtDelete);
if(!$result) {
// gebruiker inloggen
$sqlLogin = 'SELECT * FROM employee WHERE Mail=?;';
$stmtLogin = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtLogin, $sqlLogin)) {
echo 'MYSQLI login statement is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmtLogin, "s", $email);
mysqli_stmt_execute($stmtLogin);
$resultLogin = mysqli_stmt_get_result($stmtLogin);
if($rowLogin = mysqli_fetch_assoc($resultLogin)) {
$_SESSION['User'] = $rowLogin['UName'];
$_SESSION['ID'] = $rowLogin['ID'];
header("location:../wellcome.php?uid=".$row['UName']);
exit();
}
else {
echo error_get_last();
exit();
}
}
}
else {
header('Location: ../login.php?error=unknown');
exit();
}
}
}
else if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
}
else {
header('Location: ../2FAVerify.php?error=nouser&request=valid&email='.$email);
exit();
}
}
}
?>
session_start();
require 'connection.inc.php';
if(!isset($_GET['request'])) {
if($_GET['request'] !== 'valid') {
header('../2FAVerify.php?error=invalidrequest');
exit();
}
}
else if(!isset($_POST['2FAVerifyCode'])) {
header('Location: ../2FAVerify.php?error=invalidrequest');
exit();
}
else if(empty($_POST['2FACode'])) {
header('Location: ../2FAVerify.php?request=valid&error=emptyfields');
exit();
}
else {
htmlspecialchars($code = $_POST['2FACode']);
htmlspecialchars($email = $_GET['email']);
$sql = 'SELECT * FROM autorisatie WHERE uid=?;';
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)) {
echo 'mysqli check statement voor uid is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
if($row = mysqli_fetch_assoc($result)) {
// code dehashen
$codeCheck = password_verify($code, $row['token']);
// controleren wel / niet goed
if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
// wel goed
else if ($codeCheck == true) {
// de records van autorisatie verwijderen
$sqlDelete = 'DELETE FROM autorisatie WHERE uid=?;';
$stmtDelete = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtDelete, $sqlDelete)) {
echo 'MYSQLI delete statement is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmtDelete, "s", $email);
mysqli_stmt_execute($stmtDelete);
$result = mysqli_stmt_get_result($stmtDelete);
if(!$result) {
// gebruiker inloggen
$sqlLogin = 'SELECT * FROM employee WHERE Mail=?;';
$stmtLogin = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtLogin, $sqlLogin)) {
echo 'MYSQLI login statement is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmtLogin, "s", $email);
mysqli_stmt_execute($stmtLogin);
$resultLogin = mysqli_stmt_get_result($stmtLogin);
if($rowLogin = mysqli_fetch_assoc($resultLogin)) {
$_SESSION['User'] = $rowLogin['UName'];
$_SESSION['ID'] = $rowLogin['ID'];
header("location:../wellcome.php?uid=".$row['UName']);
exit();
}
else {
echo error_get_last();
exit();
}
}
}
else {
header('Location: ../login.php?error=unknown');
exit();
}
}
}
else if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
}
else {
header('Location: ../2FAVerify.php?error=nouser&request=valid&email='.$email);
exit();
}
}
}
?>
Toevoeging op 11/03/2019 19:47:37:
Het probleem is hetzelfde:
Session start niet.
Zoals ik al zei: Bewandel het pad eens naar waar de sessies aangemaakt worden. Mogelijk wordt er niet aan een if-statement voldaan of bestaat $rowLogin niet.
En ik zie gewoon dat de gebruikersnaam keurig wordt weergegeven.
Dus dan ga ik ervan uit dat geen enkele if statement, niet is gelukt.
En alle andere prepared statements, werken gewoon.
Zet in elke if-statement een verschillende echo neer, en kijk aan de hand van die echo's welke route er bewandeld wordt en of die ook inderdaad uitkomt in die if-statement van lijn 64.
Gewijzigd op 11/03/2019 20:05:50 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
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
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
<?php
else {
htmlspecialchars($code = $_POST['2FACode']);
htmlspecialchars($email = $_GET['email']);
$sql = 'SELECT * FROM autorisatie WHERE uid=?;';
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)) {
echo 'mysqli check statement voor uid is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
if($row = mysqli_fetch_assoc($result)) {
// code dehashen
$codeCheck = password_verify($code, $row['token']);
// controleren wel / niet goed
if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
// wel goed
else if ($codeCheck == true) {
// de records van autorisatie verwijderen
$sqlDelete = 'DELETE FROM autorisatie WHERE uid=?;';
$stmtDelete = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtDelete, $sqlDelete)) {
echo 'MYSQLI delete statement is mislukt';
exit();
}
else {
echo "ja1 <br>";
mysqli_stmt_bind_param($stmtDelete, "s", $email);
mysqli_stmt_execute($stmtDelete);
$result = mysqli_stmt_get_result($stmtDelete);
if(!$result) {
echo "ja2 <br>";
// gebruiker inloggen
$sqlLogin = 'SELECT * FROM employee WHERE Mail=?;';
$stmtLogin = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtLogin, $sqlLogin)) {
echo 'MYSQLI login statement is mislukt';
exit();
}
else {
echo "ja3 <br>";
mysqli_stmt_bind_param($stmtLogin, "s", $email);
mysqli_stmt_execute($stmtLogin);
$resultLogin = mysqli_stmt_get_result($stmtLogin);
if($rowLogin = mysqli_fetch_assoc($resultLogin)) {
$user = $rowLogin['UName'];
$_SESSION['User'] = $user;
echo "ja4 <br>";
exit();
}
else {
echo error_get_last();
exit();
}
}
}
else {
header('Location: ../login.php?error=unknown');
exit();
}
}
}
else if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
}
else {
header('Location: ../2FAVerify.php?error=nouser&request=valid&email='.$email);
exit();
}
}
}
?>
else {
htmlspecialchars($code = $_POST['2FACode']);
htmlspecialchars($email = $_GET['email']);
$sql = 'SELECT * FROM autorisatie WHERE uid=?;';
$stmt = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmt, $sql)) {
echo 'mysqli check statement voor uid is mislukt';
exit();
}
else {
mysqli_stmt_bind_param($stmt, "s", $email);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
if($row = mysqli_fetch_assoc($result)) {
// code dehashen
$codeCheck = password_verify($code, $row['token']);
// controleren wel / niet goed
if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
// wel goed
else if ($codeCheck == true) {
// de records van autorisatie verwijderen
$sqlDelete = 'DELETE FROM autorisatie WHERE uid=?;';
$stmtDelete = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtDelete, $sqlDelete)) {
echo 'MYSQLI delete statement is mislukt';
exit();
}
else {
echo "ja1 <br>";
mysqli_stmt_bind_param($stmtDelete, "s", $email);
mysqli_stmt_execute($stmtDelete);
$result = mysqli_stmt_get_result($stmtDelete);
if(!$result) {
echo "ja2 <br>";
// gebruiker inloggen
$sqlLogin = 'SELECT * FROM employee WHERE Mail=?;';
$stmtLogin = mysqli_stmt_init($conn);
if(!mysqli_stmt_prepare($stmtLogin, $sqlLogin)) {
echo 'MYSQLI login statement is mislukt';
exit();
}
else {
echo "ja3 <br>";
mysqli_stmt_bind_param($stmtLogin, "s", $email);
mysqli_stmt_execute($stmtLogin);
$resultLogin = mysqli_stmt_get_result($stmtLogin);
if($rowLogin = mysqli_fetch_assoc($resultLogin)) {
$user = $rowLogin['UName'];
$_SESSION['User'] = $user;
echo "ja4 <br>";
exit();
}
else {
echo error_get_last();
exit();
}
}
}
else {
header('Location: ../login.php?error=unknown');
exit();
}
}
}
else if($codeCheck == false) {
header('Location: ../2FAVerify.php?error=wrongcode&request=valid&email='.$email);
exit();
}
}
else {
header('Location: ../2FAVerify.php?error=nouser&request=valid&email='.$email);
exit();
}
}
}
?>
en ik zie:
ja1
ja2
ja3
ja4
Is er nog een programma, waarmee het mogelijk is om elke php line te debuggen en te pauzeren etc?
Net zoals het bij javascript mogelijk is met zulke "break points"
Maar heeft $rowLogin wel een bestaande waarde??
Ik vermoed dat die gewoon leeg is.
Gewijzigd op 11/03/2019 20:21:34 door - Ariën -
Want ik heb het volgende gedaan:
echo $rowLogin['UName']
En dan zie ik mijn gebruikersnaam staan.
Misschien hickup met cookies in je browser?
Toevoeging op 11/03/2019 21:17:13:
Ik lees hier:
https://stackoverflow.com/questions/35794259/php-session-variables-dont-work
Dat het misschien ook zou kunnen door de redirect headers();.
Hoe zou ik de gebruiker anders kunnen doorsturen naar de welkom pagina, zonder headers?
Als je session_start(); gebruikt (liefst globaal in een bestand) dan kan je gewoon redirect-headers gebruiken.
Gewijzigd op 11/03/2019 21:21:13 door - Ariën -
Bij de login pagina, werden de sessions op precies dezelfde mannier aangegeven en toen werkte het wel.
Ik weet het anders ook niet meer.
Gewijzigd op 11/03/2019 21:22:08 door - Ariën -
De sessions doen het weer niet...
Probeer anders je code even te verkleinen tot je het probleem vindt.
Ergens moet een fout zitten, of je browser is gewoon vreemd aan het doen.
Code (php)
Als $_GET['request'] niet is geset (de eerste if), kan $_GET['request'] nooit 'valid' zijn (de tweede if).
Hoewel het strikt genomen niet meer nodig is, zou ik verder in de Location-header een absolute URL gebruiken, geen relatieve.
Ik ben erachter gekomen dat het aan het volgende ligt:
De sessions worden opgeslagen naar de juiste directory. (C:/xampp/tmp)
Maar ze worden niet opgeslagen als cookie.
Want als ik dit neerzet:
echo $_SESSION['User'];
Zie ik mijn gebruikersnaam.
Maar ik zie linksbovenin bij google chrome niet dat de session is gestart. (geen PHPSESSID)
Dus hoe kan ik dit oplossen?
Wat zie je niet in Google Chrome?
En dan zie ik (op mijn website waar de sessions wel werken) PHPSESSID.
Maar dat zie ik nu dus niet staan.
En na even googlen, blijkt dat PHPSESSID, de standaard naam van PHP sessions te zijn.
Maar die staat er dus niet.
Ga eerst eens na of dit in elke browser gebeurt. En heb je pas iets aan php.ini aangepast, of andere sessie-afhankelijke configuratie dingen aan je site toegepast?
Ik weet niet precies meer wat het was.
dus ik ga XAMPP weer opnieuw installeren.
Ik heb het in meerdere browsers getest (IE, Edge, Firefox) en ze doen allemaal hetzelfde.