[Tuto] Inscription et connexion dans un espace membres

Petit nouveau ! | 1 Messages

31 mars 2019, 01:18

Bonsoir je vous transmet ici un code d'inscription , connexion , espace membre et profil

Si vous vous tromper de mot de passe 3 fois lors de la connexion alors un cookie sera mis en place et empêchera la connexion de l'utilisateur pendant 5 min
Je tiens aussi a préciser que les mdp des utilisateurs sont sécurisé ^^

Voici le code pour votre base de donnée sql
CREATE TABLE IF NOT EXISTS `membres` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(255) NOT NULL,
  `mail` varchar(255) NOT NULL,
  `pass` varchar(255) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=42 DEFAULT CHARSET=utf8;
Ici vous aurez le code php je tiens a préciser que pour appeler vos class dans d'autre fichier vous devrez utilise ceci
    require 'fichier.php';

  
    $login = new Set_member();
    $login->Inscription();
    $login->Connexion(); 
    $login->Profil();
    $login->Edit_Member();
    $login->Logout();
Je tient a préciser que cela dépend de la function que vous utiliserez si vous êtes sur la page de connexion alors vous utilise le le login->Connexion()

Vous pourrez récupérer les données de vos utilisateurs en effectuant des echo sur les informations si dessous
                $_SESSION['pseudo']
                $_SESSION['id'] 
                $_SESSION['mail']
Enfin vous avez le code complet n'oubliez pas que lors de votre connexion a la base de donnée donnée le nom $bdd a la variable connecté sinon le code ne fonctionnera pas bonne chance ^^
class Set_member{
    public function create_login(){

        global $bdd;
        global $error;

            if(isset($_POST['create'])) {
                // Récupération des informations
                $pseudo = filter_input(INPUT_POST, 'pseudo');
                $pass = password_hash($_POST['pass'], PASSWORD_BCRYPT);
                $mail = filter_input(INPUT_POST, 'mail');

                // On vérifie si un utilisateur n'a pas le même mail ou pseudo
                $req = $bdd->prepare('SELECT * FROM membres WHERE pseudo = :pseudo OR mail = :mail');
                $req->bindvalue(':pseudo', $pseudo, PDO::PARAM_STR);
                $req->bindvalue(':mail', $mail, PDO::PARAM_STR);
                $req->execute();
                $resultats = $req->fetchAll();

                // Si non on l'ajoute dans la base de donnée
                if (count($resultats) == 0) {
                    $req = $bdd->prepare('INSERT INTO membres(pseudo,mail,pass,date) VALUE (:pseudo,:mail,:pass,now())');
                    $req->bindvalue(':pseudo', $pseudo, PDO::PARAM_STR);
                    $req->bindvalue(':mail', $mail, PDO::PARAM_STR);
                    $req->bindvalue(':pass', $pass, PDO::PARAM_STR);
                    $req->execute();

                        $error = '<div class="alert alert-success" role="alert">Inscription effectuer avec succès</div>';
                } else {
                    $error = '<div class="alert alert-danger" role="alert">Pseudo ou Email déja utilisé</div>';
                }
            }
        }
    public function access_login(){
        global $bdd;
        global $error;

        if(isset($_POST['login'])){
            $pseudo = filter_input(INPUT_POST, 'pseudo');

            $req = $bdd->prepare('SELECT * FROM membres WHERE pseudo = :pseudo');
            $req->bindvalue(':pseudo',$pseudo,PDO::PARAM_STR);
            $req->execute();
            $resultats = $req->fetchAll();

            if($resultats > 0){
                $result = $resultats[0];
            }

            // On à récupéré le hash maintenant on vérifie si le mdp est identique à celui de la bdd
            $hash = $result['pass'];

            if(password_verify($_POST['pass'], $hash)){
                $login = 1;
            }else{
                $login = 0;
            }

            // Après quelques verifications je récupère les données de l'utilisateurs pour le connecter
            if(count($resultats) > 0 AND $_COOKIE['try'] < 3 AND $login == 1){
                //Si le cookie try existe le supprimer
                if(isset($_COOKIE['try'])){
                    setcookie('try',$_COOKIE['try']  , time() - 1,null,null,false,true);
                }

                $_SESSION['pseudo'] = $pseudo;
                $_SESSION['id'] = $result['id'];
                $_SESSION['mail'] = $result['mail'];

                $error = '<div class="alert alert-success" role="alert">Connexion réussite -> <a href="membre.php">Espace Membre</a></div>';
            }else{
                setcookie('try',$_COOKIE['try'] + 1 , time() + 300,null,null,false,true);
                $cookies = $_COOKIE['try'];

                if($cookies >= 3){
                    $error = '<div class="alert alert-primary" role="alert">Trop de Tentative réessaye dans 5 min (tu pourras de nouveau essayer à '. date("H:i:s", strtotime("+5 minute"))  .') </div>';
                }else {
                    $error = '<div class="alert alert-danger" role="alert"> Connexion rate </div>';
                }
            }
        }
    }
    public function Edit_Member(){

        global $bdd;
        global $error;

        if(isset($_POST['edit'])){

            $id = $_SESSION['id'];

            $new_password = $_POST['mdp'];
            $confirm_password = $_POST['mdp_c'];

            if($new_password == $confirm_password){
                if(strlen($new_password) > 6){
                    $password = password_hash($_POST['mdp'], PASSWORD_BCRYPT);

                    $req = $bdd->prepare('UPDATE membres SET pass = :password WHERE id = :id');
                    $req->bindValue(':password',$password,PDO::PARAM_STR);
                    $req->bindValue(':id',$id,PDO::PARAM_INT);
                    $req->execute();

                    $error = '<div class="alert alert-success" role="alert">Mot de passe changé avec succès</div>';
                }else{
                    $error = '<div class="alert alert-primary" role="alert"> Mot de passe trop court  </div>';
                }
            }else{
                $error = '<div class="alert alert-danger" role="alert">Vos deux mots de passe ne sont pas identique</div>';
            }
            }
    }
    public function Profil(){
        global $bdd;
        global $pseudo;
        global $mail;
        global $date;
        global $admin;

        $id = $_GET['id'];
        $checkid = $_SESSION['id'];

        if(isset($id)){

            $req = $bdd->prepare('SELECT * FROM membres WHERE id = :id');
            $req->bindValue(':id',$id,PDO::PARAM_INT);
            $req->execute();

            $resultats = $req->fetchAll();

            if($resultats != NULL ){
                $result = $resultats[0];

                $pseudo = $result['pseudo'];
                $mail = $result['mail'];
                $date = $result['date'];

                if($checkid == $id){
                    $admin = 1;
                }
            }else{
                die('Utilisateur inexistant');

            }
        }else{
            header('Location: membre.php');
        }
    }
    public function Logout(){
        if(isset($_POST['logout'])){
            session_unset();
            session_destroy();
        }
    }
enfin je vous transmet tout les formulaires à utiliser en html ^^
            <h2>Inscription</h2>
            <form method="post">
                <input type="text" name="pseudo" class="form-control" placeholder="Pseudo"> <br />
                <input type="email" name="mail" class="form-control" placeholder="Mail"><br />
                <input type="password" name="pass" class="form-control" placeholder="mdp"><br />
                <input type="submit" value="inscription" name="create">
            </form>
            <br />
            <h2>Connexion</h2>
            <form method="post">
                <input type="text" name="pseudo" class="form-control" placeholder="Pseudo"> <br />
                <input type="password" name="pass" class="form-control" placeholder="mdp"><br />
                <input type="submit" value="Connexion" name="login">
            </form>
        <h2>Editer vos informations</h2>

        <form method="post">
            <input type="text" class="form-control" value="<?= $pseudo ?>" readonly="readonly"> <br />
            <input type="email" class="form-control" value="<?= $_SESSION['mail']  ?>"  readonly="readonly"><br />
            <input type="password" name="mdp" class="form-control" placeholder="Mot de passe"><br />
            <input type="password" name="mdp_c" class="form-control" placeholder="Confirmer ton mdp"><br />
            <input type="submit" value="Editer" name="edit">

            <input type="submit" name="logout" value="Deconnexion">
        </form>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8149 Messages

31 mars 2019, 01:30

Je n'ai pas tout relu mais voici 2 petites pistes d'amélioration :
- Le nombre d'erreur à la suite ne devrait pas être stockée dans un cookie mais dans la bdd. En effet on fait cela pour éviter les attaques par brute-force qui sont effectuées par des robots, or généralement les robots ne gèrent pas les cookies donc ne seront pas bloqués si tu te bases sur les cookies
- Si tu ne précises pas le filtre à utiliser dans filter_input, alors la variable n'est pas filtrée du tout ce qui est un peu dommage puisqu'on utilise la fonction qui sert à cela :
$mail = filter_input(INPUT_POST, 'mail');

Merci pour le partage de ton code en tout cas. :D
Quand tout le reste a échoué, lisez le mode d'emploi...