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   -
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
<?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:

1 réponse

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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....)

<?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
1
wassil56 Messages postés 82 Date d'inscription   Statut Membre Dernière intervention   3
 
jordane45 j'été sur que c'est vous qui allait repondre a ma question, vous etes toujours l'homme de la situation quand il sagit de developpement web, merci
votre façon de coder m'impressionne meme si n'ai pas tout compri
$pseudo = !empty($_POST['pseudo'])?htmlspecialchars($_POST['pseudo']):NULL;

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
$title = !empty($msg) ? "Erreur" : "Connexion";

sinon pour les etapes que vous m'avez donné je vais maintenant commencer a concevoir l'algorithme qu'il faut
merci pour votre aide
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Pour comprendre ces lignes.. herches sur le net "php écriture ternaire "
Tu verras que c'est simplement une autre façon de faire un If/else
0
wassil56 Messages postés 82 Date d'inscription   Statut Membre Dernière intervention   3
 
oui avec ce que vous m'avez dit j'ai trouvé
https://forum.phpfrance.com/tutoriels/expr1-expr2-expr3-operateur-ternaire-t14111.html
c'est tres interessant merci
0