PHP 2-Factor Autorisatie (2FA)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 4 5 6 volgende »

Jin vanTongeren

Jin vanTongeren

11/03/2019 19:33:53
Quote Anchor link
Ja.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
        }
    }
}

?>


Toevoeging op 11/03/2019 19:47:37:

Het probleem is hetzelfde:
Session start niet.
 
PHP hulp

PHP hulp

22/12/2024 02:58:46
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 19:58:54
Quote Anchor link
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.
 
Jin vanTongeren

Jin vanTongeren

11/03/2019 20:03:09
Quote Anchor link
Ik heb als vervanging van de redirection naar de welkom pagina, print_r($_SESSION['User']) neergezet.
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.
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 20:05:27
Quote Anchor link
Niet even zomaar ergens vanuit gaan, maar dit is gewoon even je script debuggen:

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 -
 
Jin vanTongeren

Jin vanTongeren

11/03/2019 20:13:58
Quote Anchor link
Ik heb nu dit neergezet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
        }
    }
}

?>

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"
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 20:20:46
Quote Anchor link
Met Netbeans IDE en Xdebug zou het volgens mij moeten kunnen.

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 -
 
Jin vanTongeren

Jin vanTongeren

11/03/2019 21:10:14
Quote Anchor link
$rowLogin heeft een waarde.
Want ik heb het volgende gedaan:
echo $rowLogin['UName']
En dan zie ik mijn gebruikersnaam staan.
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 21:13:40
Quote Anchor link
Dan is het vreemd dat sessies niet werken.
Misschien hickup met cookies in je browser?
 
Jin vanTongeren

Jin vanTongeren

11/03/2019 21:14:28
Quote Anchor link
Hickup?


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?
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 21:19:28
Quote Anchor link
Ja, misschien accepteert je browser door *iets* geen cookies?

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 -
 
Jin vanTongeren

Jin vanTongeren

11/03/2019 21:20:55
Quote Anchor link
Ik weet het niet.
Bij de login pagina, werden de sessions op precies dezelfde mannier aangegeven en toen werkte het wel.
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 21:21:47
Quote Anchor link
Browser-f*ckup?
Ik weet het anders ook niet meer.
Gewijzigd op 11/03/2019 21:22:08 door - Ariën -
 
Jin vanTongeren

Jin vanTongeren

11/03/2019 21:29:37
Quote Anchor link
Ik heb net weer even getest om zonder 2FA in te loggen. Het resultaat:
De sessions doen het weer niet...
 
- Ariën  -
Beheerder

- Ariën -

11/03/2019 21:46:38
Quote Anchor link
Is dat de enige voorwaarde waaraan voldaan wordt als de sessies niet werken?
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.
 
Ward van der Put
Moderator

Ward van der Put

12/03/2019 08:38:43
Quote Anchor link
Ik zou de complete logica van je applicatie nog eens langslopen. Met de vinger erbij. De eerste controlestructuur gaat bijvoorbeeld al de mist in:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
if(!isset($_GET['request'])) {
    if($_GET['request'] !== 'valid') {
        header('../2FAVerify.php?error=invalidrequest');
        exit();
    }
}

?>


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.
 
Jin vanTongeren

Jin vanTongeren

12/03/2019 09:23:02
Quote Anchor link
Oké.
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?
 
- Ariën  -
Beheerder

- Ariën -

12/03/2019 09:28:17
Quote Anchor link
Wat zie je niet in Google Chrome?
 
Jin vanTongeren

Jin vanTongeren

12/03/2019 09:30:24
Quote Anchor link
Normaal gesproken kun je toch alle cookies zien?
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.
 
- Ariën  -
Beheerder

- Ariën -

12/03/2019 09:33:52
Quote Anchor link
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?
 
Jin vanTongeren

Jin vanTongeren

12/03/2019 09:40:43
Quote Anchor link
Ja, ik heb dingen aangepast.
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.
 

Pagina: « vorige 1 2 3 4 5 6 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.