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

09/03/2019 16:16:46
Quote Anchor link
Even nog een vraagje.
Als een gebruiker een verzoek heeft gemaakt, om de 2FA aan te zetten, wordt er dus een rij aangemaakt in de database.
Na 5 min wil ik dat de rij dat is aangemaakt, automatisch weer wordt verwijderd.
Kan dat?
Zoja, hoe kan ik dat regelen?
 
PHP hulp

PHP hulp

16/04/2024 20:14:15
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 16:21:37
Quote Anchor link
Met SQL:

DELETE FROM tabel WHERE creationTime < (NOW() - INTERVAL 5 MINUTE)
Gewijzigd op 09/03/2019 16:22:18 door - Ariën -
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 16:27:24
Quote Anchor link
En waar moet ik dat dan invoeren?
Bij het sql paneel in het tabel?
Of in de PHP code?
Of ergens anders?
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 16:35:14
Quote Anchor link
Als SQL-query in je PHP-code.
Steeds bij het uitvoeren ervan ruimt het oude records op.
Gewijzigd op 09/03/2019 16:35:34 door - Ariën -
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 16:50:52
Quote Anchor link
Oké.
Wat is het creationTime eigenlijk?
En nog even wat over de mysqli database tijd:
Wat voor type kolom zou ik het best voor de vervaldatum doen?
De kolom heet vervaldatum en is als type momenteel een timestamp.
Is dat goed? Of niet?
De code van de tijd (die dan in de vervaldatum kolom wordt gezet) is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$expires
= date("d-m-Y H:i:s") + 300;
?>

Is dit goed?
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 16:55:17
Quote Anchor link
Jin vanTongeren op 09/03/2019 16:50:52:
Oké.
Wat is het creationTime eigenlijk?

De datum die jij aanmaakt bij het creëren van het record.
Quote:
En nog even wat over de mysqli database tijd:
Wat voor type kolom zou ik het best voor de vervaldatum doen?
De kolom heet vervaldatum en is als type momenteel een timestamp.
Is dat goed? Of niet?

Gebruik DATETIME als veld-type.
Quote:
De code van de tijd (die dan in de vervaldatum kolom wordt gezet) is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$expires
= date("d-m-Y H:i:s") + 300;
?>

Is dit goed?

Nee, je kan dan NOW() gebruiken in je INSERT-query. Dit is een SQL-functie, en hoort niet tussen quotes.
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 16:59:32
Quote Anchor link
- Ariën - op 09/03/2019 16:55:17:
Nee, je kan dan NOW() gebruiken in je INSERT-query. Dit is een SQL-functie, en hoort niet tussen quotes.


Oké.
Maar wat moet ik dan neerzetten in mijn prepared statement?
Ik heb een prepared statement waarin de parameters zo worden gebonden:
mysqli_stmt_bind_param($stmt, "ssss", $cookieID, $hashedToken, $expires, $hashedUID);
Maar nu moet ik dus $expires laten vervangen door wat?

Toevoeging op 09/03/2019 16:59:52:

Moet ik $expires nou laten vervangen door: "now()"?
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 17:07:38
Quote Anchor link
Volgens mij zo, omdat je een MySQL-functie gebruikt. Ik weet het niet zeker omdat ik geen prepared statements gebruik.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$insert
= $mysqli->prepare("INSERT INTO tabel (een_veldnaam, publish_date) VALUES (?, NOW())");
?>
Gewijzigd op 09/03/2019 17:09:53 door - Ariën -
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 17:12:35
Quote Anchor link
- Ariën - op 09/03/2019 16:55:17:
Gebruik DATETIME als veld-type.


En nog even over dit.
Ik heb als standaardwaarde current_time en als attribuut: on update current_timestamp.
Is dit correct?
Of moet ik dit aanpassen?
(het veld-type is al datetime)
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 17:13:53
Quote Anchor link
Ja, dan hoef je die NOW() niet zelf mee te geven.
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 17:14:31
Quote Anchor link
Oké, dan laat ik het zo.

Toevoeging op 09/03/2019 17:24:52:

- Ariën - op 09/03/2019 16:21:37:
Met SQL:

DELETE FROM tabel WHERE creationTime < (NOW() - INTERVAL 5 MINUTE)


Nog heel even over dit.
Is dit veilig op deze manier?
Of moet dit op een prepared statement?
zoals dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
        $sql2FA
= 'DELETE FROM autorisatie WHERE creationTime';
        $stmt = mysqli_stmt_init($conn);
        if(!mysqli_stmt_prepare($stmt, $sql2FA)) {
            echo 'MYSQLI statement voor 2FA auto verwijder is mislukt';
            exit();
        }

        else {
            mysqli_stmt_bind_param($stmt, "s", "<(NOW() - INTERVAL 5 MINUTE)");
            mysqli_stmt_execute($stmt);
        }

?>

Of is dit verkeerd?
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 17:43:48
Quote Anchor link
Ik zou het in een prepared statement doen als query.
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 18:28:44
Quote Anchor link
Hoe kan ik mysqli commando invoeren als query?
ik heb nu dit:
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
<?php
        $sql2FA
= 'DELETE FROM autorisatie WHERE creationTime=?';
        $stmt2FA = mysqli_stmt_init($conn);
        if(!mysqli_stmt_prepare($stmt2FA, $sql2FA)) {
            echo 'MYSQLI statement voor 2FA auto verwijder is mislukt';
            exit();
        }

        else {
            $timedelete = "<(NOW() - INTERVAL 5 MINUTE)";
            mysqli_stmt_bind_param($stmt2FA, "s", $timedelete);
            mysqli_stmt_execute($stmt2FA);
            $result = mysqli_stmt_get_result($stmt2FA);
            
            mysqli_stmt_close($stmt2FA);
            mysqli_close($conn);
        }

?>


Maar ik geloof niet dat dit goed is, want nu krijg ik:
Warning: mysqli_stmt_init(): Couldn't fetch mysqli in C:\xampp\htdocs\website met 2FA\header.php on line 52

Warning: mysqli_stmt_prepare() expects parameter 1 to be mysqli_stmt, bool given in C:\xampp\htdocs\website met 2FA\header.php on line 53

wilt u iets voorstellen?
Maakt mij niet uit of het oop / pdo / procedural is.
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 18:48:06
Quote Anchor link
Zie mijn bericht van: 09/03/2019 17:07:38

Want je kan geen MySQL-functies binden.
Gewijzigd op 09/03/2019 18:49:43 door - Ariën -
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/03/2019 19:12:58
Quote Anchor link
@Rob: Op zich een duidelijk verhaal wat je schrijft maar is dan een "code via de mail" hetzelfde als "emailverificatie" wat ik nu slechts eenmalig doe wanneer een nieuwe gebruiker zich registreert? (Dus bij het registreren een emailadres laten invullen en dan een mailtje sturen met een bevestigingslink) zo niet waar zit dan precies het verschil?
 
Thomas van den Heuvel

Thomas van den Heuvel

09/03/2019 19:50:55
Quote Anchor link
Dit alles lijkt ook allemaal wat moeite te kosten, en dan gaat het niet eens over (feilloze) implementaties van technische concepten maar knowhow over syntax - wellicht eerst eens ergens een standaard oplossing vandaan trekken en later als je wat meer ervaring/bagage hebt opnieuw proberen het wiel zelf uit te vinden?
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 20:04:40
Quote Anchor link
Als je zelf toch een bestaande 2FA, zoals Google Authenticator wilt gebruiken. Dan kan ik deze aanraden:
https://github.com/PHPGangsta/GoogleAuthenticator

Om het even helder te houden sla je de 'secret' dus op in de database bij de gebruiker. En aan de hand van getQRCodeGoogleUrl() kan je een QR-code genereren.
 
Rob Doemaarwat

Rob Doemaarwat

09/03/2019 20:15:14
Quote Anchor link
@Frank: Die "mail" waar ik het over had is meer zoals ie door Jin bedoelt wordt: "een tweede [extra] authenticatie" (je hebt ook toegang tot de mail). Dat je de juiste code hebt ingevoerd sla ik wel op in de sessie (evt. met een time-out), maar de volgende keer zul je 'm weer moeten invoeren. Maar je zou er dus gewoon een extra "authenticator" aan toe kunnen voegen die "verified" heet. Die zal dan ergens op moeten slaan of de user al geverifieerd is, en daarna dus altijd true retourneren (moet je al wel weten om welke gebruiker het gaat, bijvoorbeeld aan de hand van inloggen met password). Als iemand nog niet geverifieerd is schiet je een mailtje af (vergelijkbaar met de "eenmalige code" waar we het hierboven steeds over hebben).
 
Jin vanTongeren

Jin vanTongeren

09/03/2019 20:27:45
Quote Anchor link
Hallo.
Ik ben weer met een probleem met mijn 2FA systeempje.
Ik ben nu bezig met het 2FA code verzenden voor als de gebruiker dan gaat inloggen.
Mijn submit button doet het niet.
Als ik erop klik, gebeurt er letterlijk niets.
Ik weet niet hoe dit kan.
Dit is mijn (formulier) code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<html>
            <form method="post" action="includes/enable2FA.inc.php?uid=<?php echo $userName ?>&email=<?php echo $email?>&id=<?php echo $id ?>">
                <div style="min-height: 50px;" class="form-group input-group">
                  <div class="input-group-prepend">
                      <span class="input-group-text"><i class="fas fa-at"></i></span>
                  </div>
                 <input type="text" name="email2FA" style="min-height: 50px;" class="form-control" placeholder="Uw E-Mail"/>
                </div>
                <button type="submit" class="btn btn-success" name="2FAEnable" style="margin-bottom: 100px;">Code verzenden</button>
            </form>
</html>

Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 09/03/2019 20:36:24 door - Ariën -
 
- Ariën  -
Beheerder

- Ariën -

09/03/2019 20:37:20
Quote Anchor link
Het ligt aan de afhandeling in je PHP-code in includes/enable2FA.inc.php. Dus laat eens wat meer zien? Zijn uid en email wel bekend?
Gewijzigd op 09/03/2019 20:42:34 door - Ariën -
 

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.