PHP 2-Factor Autorisatie (2FA)
Pagina: « vorige 1 2 3 4 5 6 volgende »
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?
DELETE FROM tabel WHERE creationTime < (NOW() - INTERVAL 5 MINUTE)
Gewijzigd op 09/03/2019 16:22:18 door - Ariën -
Bij het sql paneel in het tabel?
Of in de PHP code?
Of ergens anders?
Steeds bij het uitvoeren ervan ruimt het oude records op.
Gewijzigd op 09/03/2019 16:35:34 door - Ariën -
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:
Is dit goed?
Jin vanTongeren op 09/03/2019 16:50:52:
Oké.
Wat is het creationTime eigenlijk?
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?
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:
Is dit goed?
Is dit goed?
Nee, je kan dan NOW() gebruiken in je INSERT-query. Dit is een SQL-functie, en hoort niet tussen quotes.
- 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()"?
Code (php)
1
2
3
2
3
<?php
$insert = $mysqli->prepare("INSERT INTO tabel (een_veldnaam, publish_date) VALUES (?, NOW())");
?>
$insert = $mysqli->prepare("INSERT INTO tabel (een_veldnaam, publish_date) VALUES (?, NOW())");
?>
Gewijzigd op 09/03/2019 17:09:53 door - Ariën -
- 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)
Ja, dan hoef je die NOW() niet zelf mee te geven.
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)
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)
1
2
3
4
5
6
7
8
9
10
11
12
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);
}
?>
$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?
Ik zou het in een prepared statement doen als query.
ik heb nu dit:
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
<?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);
}
?>
$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.
@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?
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?
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.
@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).
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)
1
2
3
4
5
6
7
8
9
10
11
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>
<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.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 09/03/2019 20:36:24 door - Ariën -
Gewijzigd op 09/03/2019 20:42:34 door - Ariën -