Securiser une page de connection
wassil56
Messages postés
82
Date d'inscription
Statut
Membre
Dernière intervention
-
wassil56 Messages postés 82 Date d'inscription Statut Membre Dernière intervention -
wassil56 Messages postés 82 Date d'inscription Statut Membre Dernière intervention -
bonjour
je suis en train de faire un site web avec possibilité de s'inscrire et de se connécter
voici le code que j'utilise pour la connection
donc j'utiliser PDO avec des requetes préparées
maintenant je vois que mon code n'est as efficace contre des attaques de type force brute
je voudrais des idées pour ameliorer le code pour permetre par exemple 3 essais, et si apres le troisieme essai il ya echec, il faut attendre 15 minutes
dites moi aussi si d'autres failles existents si vous en connaissez
et merci infiniment :)
je suis en train de faire un site web avec possibilité de s'inscrire et de se connécter
voici le code que j'utilise pour la connection
<?php if (isset($_POST['pseudo']) AND ($_POST['pass'])) { $pseudo = htmlspecialchars($_POST['pseudo']); $pass_hache = sha1(htmlspecialchars($_POST['pass'])); require ('bdd.php'); $req = $bdd->prepare('SELECT id FROM admin WHERE pseudo = :pseudo AND pass = :pass'); $req->execute(array( 'pseudo' => $pseudo, 'pass' => $pass_hache)); $resultat = $req->fetch(); if (!$resultat) { ?> <head> <title>Erreur</title> </head> <body> <form style="border: 2px solid black;width:300px;margin:auto;text-align:center;" method="post" action="verif.php"> <p>Mauvais identifiant ou mot de passe !</p> <p >Identifiant :<br/><input type="text" name="pseudo" required/></p> <p >Mot de passe :<br/><input type="password" name="pass" required/></p> <input style="width:100px;" type="submit" value="Se connecter"> </form> </body> <?php } else { session_start(); $_SESSION['id'] = $resultat['id']; $_SESSION['pseudo'] = $pseudo; header('location:espace.php'); } } else { ?> <head> <title>Erreur</title> </head> <body> <form style="border: 2px solid black;width:300px;margin:auto;text-align:center;" method="post" action="verif.php"> <p>Des informations sont manquantes</p> <p >Identifiant :<br/><input type="text" name="pseudo" required/></p> <p >Mot de passe :<br/><input type="password" name="pass" required/></p> <input style="width:100px;" type="submit" value="Se connecter"> </form> </body> <?php } ?>
donc j'utiliser PDO avec des requetes préparées
maintenant je vois que mon code n'est as efficace contre des attaques de type force brute
je voudrais des idées pour ameliorer le code pour permetre par exemple 3 essais, et si apres le troisieme essai il ya echec, il faut attendre 15 minutes
dites moi aussi si d'autres failles existents si vous en connaissez
et merci infiniment :)
A voir également:
- Securiser une page de connection
- Supprimer une page word - Guide
- Gmail connection - Guide
- Imprimer tableau excel sur une page - Guide
- Créer une page facebook - Guide
- Comment traduire une page - Guide
1 réponse
Bonjour,
Déjà ... voici ton code un peu amélioré....
pas besoin de dupliquer du code html dans tes IF/ELSEE (aie.. j'en ai encore mal aux yeux....)
Et pour ce qui est de ta question :
Le plus simple c'est :
1 - Tu récupères l'IP de l'utilisateur
(via
2 - A chaque tentative en erreur tu insères une ligne dans une table comportant : L'ip / le pseudo / la Date Heure de l'ajout en BDD de cette ligne
3 - Lorsque tu affiches la page de connexion, tu requêtes sur cette table pour savoir combien de connexions en erreur il y a eu depuis x minutes... si =3 ... alors... tu rediriges vers une page d'erreur....
3 bis : Si la connexion est réussis.. je pense qu'une PURGE de la table (concernant ce user) peut être faite...
Cordialement,
Jordane
Déjà ... voici ton code un peu amélioré....
pas besoin de dupliquer du code html dans tes IF/ELSEE (aie.. j'en ai encore mal aux yeux....)
<?php //Démarrage des variables de SESSION (avant toute autre chose ! ) session_start(); //connexion à la BDD require_once 'bdd.php'; //récupération "propre" des variables : $pseudo = !empty($_POST['pseudo'])?htmlspecialchars($_POST['pseudo']):NULL; $pass = !empty($_POST['pass'])?$_POST['pass']:NULL; //variable utilisée pour afficher message d'erreur $msg = ""; //Traitement du submit : if (isset($_POST['pseudo']) aa ($_POST['pass'])){ if($pseudo && $pass){ try{ $pass_hache = sha1(htmlspecialchars($_POST['pass'])); $sql = "SELECT id FROM admin WHERE pseudo = :pseudo AND pass = :pass"; $params = array('pseudo' => $pseudo , 'pass' => $pass_hache ); $req = $bdd->prepare($sql); $req->execute($params); $resultat = $req->fetch(); if($resultat){ $_SESSION['id'] = $resultat['id']; $_SESSION['pseudo'] = $pseudo; header('location:espace.php'); }else{ $msg = "Mauvais identifiant ou mot de passe !"; } }catch(PDOException $e) { // En cas d'erreur dans la requête echo "<br><b>Erreur dans la requête: </b><br>".$e->getMessage(); } }else{ $msg="Des informations sont manquantes"; } } // titre de la page $title = !empty($msg) ? "Erreur" : "Connexion"; ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><?php echo $title;?></title> </head> <body> <form style="border: 2px solid black;width:300px;margin:auto;text-align:center;" method="post" action="verif.php"> <p><?php echo $msg;?></p> <p >Identifiant :<br/><input type="text" name="pseudo" required value="<?php echo $pseudo;?>"/></p> <p >Mot de passe :<br/><input type="password" name="pass" required/></p> <input style="width:100px;" type="submit" value="Se connecter"> </form> </body> </html>
Et pour ce qui est de ta question :
je voudrais des idées pour ameliorer le code pour permetre par exemple 3 essais, et si apres le troisieme essai il ya echec, il faut attendre 15 minutes
Le plus simple c'est :
1 - Tu récupères l'IP de l'utilisateur
(via
$_SERVER['REMOTE_ADDR'])
2 - A chaque tentative en erreur tu insères une ligne dans une table comportant : L'ip / le pseudo / la Date Heure de l'ajout en BDD de cette ligne
3 - Lorsque tu affiches la page de connexion, tu requêtes sur cette table pour savoir combien de connexions en erreur il y a eu depuis x minutes... si =3 ... alors... tu rediriges vers une page d'erreur....
3 bis : Si la connexion est réussis.. je pense qu'une PURGE de la table (concernant ce user) peut être faite...
Cordialement,
Jordane
votre façon de coder m'impressionne meme si n'ai pas tout compri
que signifie le ?variable:NULL j'ai juste compri qu'il sagit d'une condition !empty=if not empty, enfin je pense
meme chose pour ce code s'il vous plait
sinon pour les etapes que vous m'avez donné je vais maintenant commencer a concevoir l'algorithme qu'il faut
merci pour votre aide
Tu verras que c'est simplement une autre façon de faire un If/else
https://forum.phpfrance.com/tutoriels/expr1-expr2-expr3-operateur-ternaire-t14111.html
c'est tres interessant merci