Bonjour à tous,

Voila alors j'ai un formulaire d'inscription, j'aimerai que pendant l'inscription d'un utilisateur il s'inscrit avec une adresse mail unique exemple avec nom@gmail.com, si un utilisateur s'inscrit avec un outlook ou yahoo ou autre nom de doamine alors je veux que ca lui refuse l'inscription et lui affiche un message par exemple votre adresse mail n'appartient pas au nom de domaine je sais qu'il faut faire un if preg_match mais pour verifier le nom d'un domaine je ne sais pas comment faire? Merci beaucoup de votre aide.

Voici mon code:

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

    if(!empty($_POST['genre']) AND !empty($_POST['nom']) AND !empty($_POST['prenom']) AND !empty($_POST['date']) AND !empty($_POST['choix']) AND !empty($_POST['utilisateur']) AND !empty($_POST['email']) AND !empty($_POST['pass']) AND !empty($_POST['pass2']))
    {

        /* REQUETE SI nom d'utilisateur EXISTE DANS LA BASE*/    
        $reqpseudo = $bdd->prepare("SELECT * FROM user WHERE utilisateur = ?");
        $reqpseudo->execute(array($_POST['utilisateur']));
        $pseudoexist = $reqpseudo->rowCount();    
        if($pseudoexist == 0)
        {
            /* si mail existe */
            $reqmail = $bdd->prepare("SELECT * FROM user WHERE mail = ?");
            $reqmail->execute(array($_POST['email']));
            $mailexist = $reqmail->rowCount();
            if($mailexist == 0)
            {

                if($_POST['pass'] == $_POST['pass2'])
                {
                    $pass = sha1($_POST['pass']);
                    $token = str_random(60);
                    $insertuser = $bdd->prepare("INSERT INTO user(civilite, nom, prenom, naissance, affiche_anniv, utilisateur, mail, password, user_valide, token) VALUES(?, ?, ?, ?, ?, ?, ?, ?, 0, ?)");
                    $insertuser->execute(array($_POST['genre'], $_POST['nom'], $_POST['prenom'], $_POST['date'], $_POST['choix'], $_POST['utilisateur'], $_POST['email'],$pass, $token));

                    $user_id = $bdd->lastInsertId();
                    $message = "Bienvenue à l'intranet de la ville ".$_POST['utilisateur'].",

Pour activer votre compte, veuillez cliquer sur le lien ci-dessous
ou copier/coller dans votre navigateur Internet.

**************************************************************

----------------------------
Ceci est un mail automatique, Merci de ne pas y répondre.";

                    mail($_POST['email'], 'Activer votre compte', $message) ;
                    header("Refresh: $delai; url=$url");
                    die();

                }
                else{
                    $errors = "Vos mot de passe ne correspondent pas, veuillez recommencer.";
                    header("Refresh: $delai2; url=$url2");
                }

            }
            else{
                $msg1 = "Adresse mail déjà disponible, veuillez recommencer";  
            }

        }
        else{
            $msg = "Le nom d'utilisateur existe déjà, veuillez recommencer.";
            header("Refresh: $delai2; url=$url2");
        }/* REQUETE SI PSEUDO EXISTE DANS LA BASE*/    
    }

} 

22 réponses


Balsakup
Réponse acceptée

Salut,

https://regex101.com/r/IrGl2r/1

Pour un regex qui récupère le domain de l'email.

preg_match('/@(?<domain>.*)$/m', $email, $matches);

if (in_array($matches['domain'], ['outlook.com', 'yahoo.com'])) {
    die('Domaine non autorisé');
}
KiloOctet
Auteur
Réponse acceptée

Bonjour, j'ai changer de méthode, que je vais vous expliquer après, je crois que le code fonctionne car je l'ai mis au début de la page du formulaire et le mot de passe se change correctement, mais quand je fais cela avec du ajax j'obtient une erreur ?!!

<?php
$errors = [];
$success = false;
require '../inc/init.php';
if(!empty($_GET['email']) && !empty($_GET['code_reset']))
{
    $email = $_GET['email'];
    $code_reset = $_GET['code_reset'];

    // On récupère ces données dans la base
    $sql_selectMembre = 'SELECT * FROM users WHERE email = :email AND code_reset = :code_reset';
    $req_selectMembre = $pdo->prepare($sql_selectMembre);
    $req_selectMembre->execute(
        [
            'email' => $email,
            'code_reset' => $code_reset
        ]
    );
    $user = $req_selectMembre->fetch();

    if($user)
    {
        if(!empty($_POST))
        {
            if(!empty($_POST['password']))
            {
                $passwordHash = password_hash($_POST['password'], PASSWORD_DEFAULT);

                $sql_insertpassword = 'UPDATE users SET password = :password, code_reset = NULL WHERE id = :id';
                $insert_password = $pdo->prepare($sql_insertpassword);
                $insert_password->execute(
                    [
                        'password' => $passwordHash,
                        'id' => $user['id']
                    ]
                );
                $success = true;
            }else{
                array_push($errors, ['password', "Une erreur s'est produite, veuillez réessayyter"]);
            }
        }
    }else{
        header('Location: ../connexion.php');
    }
}

$return = [
    'success' => $success,
    'errors' => $errors
];
die(json_encode($success));
?>

Code ajax:

$('#password-change').on('submit', function(e) {
        form = $('form#password-change');
        button = form.find('button');
        $.ajax({
            url: './users/password-forgot.php',
            type: 'POST',
            data: $(this).serialize(),
            dataType: 'json',
            beforeSend: function() {
                $("#btn-password").hide();
                $("#btn-loading-password").show();
                button.prop('disabled', true);
            }
        }).done(function(success) {
            console.log("data est :",success)
            if(success){
                form.fadeOut(function() {
                    $('#reset_password').fadeIn();
                    setTimeout(function(){
                        window.location.replace("http://localhost/xampp/DEv/connexion.php");
                    }, 2000)
                });
            }else{
                alert("Une erreur s'est produite.");
                form.find('#btn-password').html("Modifier le mot de passe");
                $("#btn-password").show();
                $('#btn-loading-password').hide();
                button.prop('disabled', false);
            }
        });
        e.preventDefault();
    });

Super ça fonctionne GG a toi merci beaucoup Balsakup :)

Alors ca semble fonctionner j'ai true dans la console, et le message success sauf que quand je regarde dans la base de données, rien n'a changer:

if(isset($_POST['password']))
{ 
    $sql_user = 'SELECT * FROM users WHERE password = :password AND code_reset = NULL';
    $requser = $pdo->prepare($sql_user);
    $requser->execute(
        [
            'password' => $_POST['password']
        ]
    );
    $user = $requser->fetch();
    if(!empty($_POST['password']))
    {
        $password = $_POST['password'];
        $passwordHash = password_hash($password, PASSWORD_DEFAULT);
        if($passwordHash)
        {
            $sql_insertpassword = 'UPDATE users SET password = :password WHERE id = :id';
            $insert_password = $pdo->prepare($sql_insertpassword);
            $insert_password->execute(
                [
                    'password' => $passwordHash,
                    'id' => $user['id']
                ]
            );
            $success = true;
        }else{
            array_push($errors, ['password', "Une erreur s'est produite, veuillez réessayyter"]);
        }
    }
}

ça ne peut pas fonctionner,
comment veux-tu récupérer le mdp dans la bdd avec le mdp de l'utilisateur sachant que le mdp est hashé donc comparable uniquement avec password_verify
il faut récupérer avec l'email et l'ajout d'un token pour éviter l'activation par force brute (si je ne dis pas de bêtise)

et on doit la deviner cette erreur ?
tu utilises post pour l'ajax mais rien GET donc ça ne fonctionnera pas

ah d'accord, et comment je dois le changer ? le GET je dois le mettre ou sur le code ajax ?

Tu fais ta requête Ajax en POST ...

url: './users/password-forgot.php',

Mais dans ton URL où sont ces variables GET ? Sinon tu passes tout en POST (via le serialize) en réinjectant tes deux variables GET par des champs cachés (<input type="hidden" name="email" value="<?= htmlspecialchars($_GET['email']) ?>" > - pareil pour l'autre - et tu changes les $_GET en $_POST)

C'est toi "The_Alpha" sur OCC ?

D'accord, Euh c'est pas la même personne sur openclasroom ?

j'y suis aussi (Aurélien.c)

Ah d'accord :) mais je ne sais pas comment injecter les deux variables GET par des champs cachés. certes les champs cachés je sais comment les contruire mais les en réinjectant j'arrive pas a bien saisir le concept, il me la montrer, mais ou je dois le mettre ces deux variables ?

tu fais des champs input de type "hidden" comme tu le ferais normalement et tu pourras ainsi les récupérer en POST

J'ai fais comme cela, j'ai rajouter les deux champs cachés sur le formulaire.

 $('#success-password').on('submit', function(e) {
        form = $('form#success-password');
        button = form.find('button');
        var hidden=$('.hidden');
        var dataString='email='+email+'&code_reset='+code_reset;
        $.ajax({
            url: './users/password-forgot.php',
            type: 'POST',
            data: dataString,
            dataType: 'json',
            beforeSend: function() {
                $("#btn-password").hide();
                $("#btn-loading-password").show();
                button.prop('disabled', true);
                form.find('div.invalid-feedback').remove();
                form.find('input').each(function() {
                    $(this).removeClass('is-invalid');
                });
            }
        }).done(function(data) {

euh la tu me montres le code js, c'est le html et php qu'il faut

Code php

<?php
$errors = [];
$success = false;
require '../inc/init.php';
if(!empty($_POST['email']) && !empty($_POST['code_reset']))
{

    // On récupère ces données dans la base
    $sql_selectMembre = 'SELECT * FROM users WHERE email = :email AND code_reset = :code_reset';
    $req_selectMembre = $pdo->prepare($sql_selectMembre);
    $req_selectMembre->execute(
        [
            'email' => $_POST['email'],
            'code_reset' => $_POST['code_reset']
        ]
    );
    $user = $req_selectMembre->fetch();
    if($user)
    {
        if(!empty($_POST))
        {
            if(!empty($_POST['password']))
            {
                $passwordHash = password_hash($_POST['password'], PASSWORD_DEFAULT);

                $sql_insertpassword = 'UPDATE users SET password = :password, code_reset = NULL WHERE id = :id';
                $insert_password = $pdo->prepare($sql_insertpassword);
                $insert_password->execute(
                    [
                        'password' => $passwordHash,
                        'id' => $user['id']
                    ]
                );
                $success = true;
            }else{
                array_push($errors, ['password', "Une erreur s'est produite, veuillez réessayyter"]);
            }
        }
    }else{
        header('Location: ../connexion.php');
    }
}
$return = [
    'success' => $success,
    'errors' => $errors
];
die(json_encode($return));
?>

Formulaire:

<form method="post" action="" id="password-change">
                                    <div class="row">
                                        <div class="col-md-12 col-sm-12 col-xs-12">
                                            <div class="form-group">
                                                <label for="password"><i class="fa fa-lock" id="user"></i>Votre mot de passe</label>
                                                <input type="password" class="form-control input-label" id="password" name="password" placeholder="Votre mot de passe" required>
                                                <input type="hidden" class="hidden" name="email" value="<?= htmlspecialchars($_GET['email']) ?>" >
                                                <input type="hidden" class="hidden" name="code_reset" value="<?= htmlspecialchars($_GET['code_reset']) ?>" >
                                            </div>
                                        </div>

                                        <div class="col-md-12 btn-resp">
                                            <button type="submit" class="btn-default btn abt-btn" id="btn-password" name="envoi-password">Modifier le mot de passe
                                                <i class="fa fa-circle-o-notch fa-spin loading hide" style="margin-left: 5px;"></i>
                                                <button type="button" class="ui primary loading button" style="display:none;" id="btn-loading-password">Loading
                                                </button>
                                            </button>
                                        </div>
                                    </div>
                                </form>

d'accord donc tout est bon ?

ah, parce-ce que la sa devrait être bon?!! non c'est pas bon du tout. alors des que je suis sur la console, j'ai des message rouge qui apparait puis disparait et je n'arrive pas a les lire quand je clique sur valider.

Donc si c'est comme ca qu'il fallait faire, je vais modifier un peu le code. et je te tient au jus demain si ca à fonctionner.. je ne peux pas rester beaucoup plus longtemps sur l'écran.. Merci à toi.

le code à l'air bon, donc a toi de me dire si ton mdp est bien modifié

Non pas du tout, ca na rien changer.

Bonjour, alors ca fonctionne a moitié, l'erreur vient du code php. j'ai le message d'erreur: Une erreur s'est produite, veuillez réessayer

<?php
$errors = [];
$success = false;
require '../inc/init.php';
if(!empty($_POST['email']) && !empty($_POST['code_reset']))
{
    $email = trim($_POST['email']);
    $code_reset = trim($_POST['code_reset']);
    // On récupère ces données dans la base
    $sql_selectMembre = 'SELECT * FROM users WHERE email = :email AND code_reset = :code_reset';
    $req_selectMembre = $pdo->prepare($sql_selectMembre);
    $req_selectMembre->execute(
        [
            'email' => $email,
            'code_reset' => $code_reset
        ]
    );
    $user = $req_selectMembre->fetch();
    if($user)
    {
        if(!empty($_POST))
        {
            if(!empty($_POST['password']))
            {
                $passwordHash = password_hash($_POST['password'], PASSWORD_DEFAULT);

                $sql_insertpassword = 'UPDATE users SET password = :password, code_reset = NULL WHERE id = :id';
                $insert_password = $pdo->prepare($sql_insertpassword);
                $insert_password->execute(
                    [
                        'password' => $passwordHash,
                        'id' => $user['id']
                    ]
                );
                $success = true;
            }else{
                array_push($errors, ['password', "Une erreur s'est produite, veuillez réessayer"]);
            }
        }
    }else{
        header('Location: ../connexion.php');
    }
}
$return = [
    'success' => $success,
    'errors' => $errors
];
die(json_encode($return));
?>

et le code ajax j'ai fais comme ce cis

$('#password-change').on('submit', function(e) {
        form = $('form#password-change');
        button = form.find('button');
        var email = $('#email').val();
        var code_reset = $('#code_reset').val();
        var hidden = $('hidden').val();
        $.ajax({
            url: './users/password-forgot.php',
            type: 'POST',
            data: {email: email, code_reset: code_reset, hidden: hidden},
            dataType: 'json',
            beforeSend: function() {
                $("#btn-password").hide();
                $("#btn-loading-password").show();
                button.prop('disabled', true);
                form.find('div.invalid-feedback').remove();
                form.find('input').each(function() {
                    $(this).removeClass('is-invalid');
                });
            }
        })

j'ai ajouter un autre champs inpu pour confirme mot de passe, sauf, qunad je met les bon mots de passe. ca me dit toujours mot de passe incorrect je ne comprend pas pourquoi.

<?php
$errors = [];
$success = false;
require '../inc/init.php';
if(!empty($_POST['email']) && !empty($_POST['code_reset']))
{
    $email = trim($_POST['email']);
    $code_reset = trim($_POST['code_reset']);
    // On récupère ces données dans la base
    $sql_selectMembre = 'SELECT * FROM users WHERE email = :email AND code_reset = :code_reset';
    $req_selectMembre = $pdo->prepare($sql_selectMembre);
    $req_selectMembre->execute(
        [
            'email' => $email,
            'code_reset' => $code_reset
        ]
    );
    $user = $req_selectMembre->fetch();
    if($user)
    {
        if(!empty($_POST))
        {
            if(!empty($_POST['password']) && $_POST['password'] == $_POST['confirme_password']) 
            {
                $passwordHash = password_hash($_POST['password'], PASSWORD_DEFAULT);

                $sql_insertpassword = 'UPDATE users SET password = :password, code_reset = NULL WHERE id = :id';
                $insert_password = $pdo->prepare($sql_insertpassword);
                $insert_password->execute(
                    [
                        'password' => $passwordHash,
                        'id' => $user['id']
                    ]
                );
                $success = true;
            }else{
                array_push($errors, ['password', "Vos mot de passe ne correspondent pas"]);
                array_push($errors, ['confirme_password', "Vos mot de passe ne correspondent pas"]);
            }
        }
    }else{
        header('Location: ../connexion.php');
    }
}
$return = [
    'success' => $success,
    'errors' => $errors
];
die(json_encode($return));
?>