Test de validité nom de domaine

Par KiloOctet, il y a 5 ans


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, il y a 5 ans

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, il y a 5 ans

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

KiloOctet, il y a 5 ans

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"]); } } }
Carouge10, il y a 5 ans

ç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)

KiloOctet, il y a 5 ans

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(); });
Carouge10, il y a 5 ans

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

KiloOctet, il y a 5 ans

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

Carouge10, il y a 5 ans

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 ?

KiloOctet, il y a 5 ans

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

Carouge10, il y a 5 ans

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

KiloOctet, il y a 5 ans

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 ?

Carouge10, il y a 5 ans

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

KiloOctet, il y a 5 ans

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) {
Carouge10, il y a 5 ans

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

KiloOctet, il y a 5 ans

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>
Carouge10, il y a 5 ans

d'accord donc tout est bon ?

KiloOctet, il y a 5 ans

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.

KiloOctet, il y a 5 ans

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.

Carouge10, il y a 5 ans

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

KiloOctet, il y a 5 ans

Non pas du tout, ca na rien changer.

KiloOctet, il y a 5 ans

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'); }); } })
KiloOctet, il y a 5 ans

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)); ?>