Securiser une page de connection

Fermé
wassil56 Messages postés 82 Date d'inscription mardi 12 mai 2015 Statut Membre Dernière intervention 16 octobre 2015 - 16 août 2015 à 19:07
wassil56 Messages postés 82 Date d'inscription mardi 12 mai 2015 Statut Membre Dernière intervention 16 octobre 2015 - 16 août 2015 à 20:40
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 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié par jordane45 le 16/08/2015 à 19:50
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 mardi 12 mai 2015 Statut Membre Dernière intervention 16 octobre 2015 3
16 août 2015 à 20:11
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 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
16 août 2015 à 20:34
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 mardi 12 mai 2015 Statut Membre Dernière intervention 16 octobre 2015 3
16 août 2015 à 20:40
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