[RESOLU] probleme regex mail

Eléphant du PHP | 194 Messages

07 avr. 2023, 05:29

Bonjour à tous,

Je rencontre un problème lors de l'application de ma regex ci-dessous:

Code : Tout sélectionner

// Regex qui controle le mail avec protection injection sql define('REGEX_MAIL_INJECTION_SQL', "/^(?!.*[<>\/@])[-\w.%+]+@[-\w.]+\.[a-zA-Z]{2,}$/");
Voici input mail :

Code : Tout sélectionner

<div class="mt-3"> <label for="exampleFormControlInput1" class="form-label texte"> Mail de contact :</label> <input type="email" class="form-control" id="mail" name="mail" pattern="<?=REGEX_MAIL_INJECTION_SQL?> placeholder="Mail (obligatoire)" <?php if (isset($mail)) echo 'value="' . htmlspecialchars($mail) . '"'; ?> required> </div>
et voici mon controlleur :

Code : Tout sélectionner

$mail = trim(filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL)); if (!preg_match(REGEX_MAIL_INJECTION_SQL, $mail)) { // Si la variable mail ne correspond pas à l'expression régulière // renvoyer un message d'erreur ou faire quelque chose d'autre $error["mail"] = 'L\'adresse email n\'est pas valide'; }
cela me renvoie toujours :
veuillez modifier la valeur pour correspondre au format demandé.

Ma page ou est définie la regex est bien appelé .
Je sais pas quoi faire.

Merci par avance pour votre aide.
@+ filou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2023, 10:51

Regarde le code HTML généré, tu verras que tu as un problème de guillemets ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 194 Messages

07 avr. 2023, 19:15

Merci pour ton aide,

mais cela ne change pas j'ai toujours mon message d'erreur.

Code : Tout sélectionner

<div class="mt-3"> <label for="exampleFormControlInput1" class="form-label texte"> Mail de contact :</label> <input type="email" class="form-control" id="mail" name="mail" pattern="<?=REGEX_MAIL_INJECTION_SQL?>" placeholder="Mail (obligatoire)" <?php if (isset($mail)) echo 'value="' . htmlspecialchars($mail) . '"'; ?> required> </div> <div class="error mb-3"><?= htmlentities($error['mail'] ?? '', ENT_QUOTES, 'UTF-8')?></div>
Merci par avance pour votre aide.
@+Filou

Eléphant du PHP | 194 Messages

07 avr. 2023, 19:23

Dans l’inspecteur web cela me met : pattern="/^(?!.*[<>\/@])[-\w.%+]+@[-\w.]+\.[a-zA-Z]{2,}$/"

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

07 avr. 2023, 21:16

Pour utiliser un pattern dans un input tu n'as pas besoin du délimiteur / au début et à la fin.
Par ailleurs, ton pattern me semble fonctionner pour aucune adresse mail, teste le avant, par exemple sur https://regex101.com
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

07 avr. 2023, 22:29

Tu devrais autoriser les caractères qu'il faut plutôt que de chercher à enlever tous les caractères interdits, j'ai fais un regex PHP à ce sujet, ça te montrera comment je procède et comment tu peux le faire :

https://www.c2script.com/scripts/verifi ... hp-s2.html

Eléphant du PHP | 194 Messages

07 avr. 2023, 22:40

Merci pour votre aide.
C'est vraiment des que je met la pattern dans input que rien ne fonctionne .

Merci pour votre aide.
@+Filou

Avatar du membre
Mammouth du PHP | 1564 Messages

07 avr. 2023, 22:52

Pour le côté HTML mets un champ de type email, vérifie ensuite ce qu'à rentré l'utilisateur avec PHP.

https://developer.mozilla.org/fr/docs/W ... es/pattern

Comme la dit @rthur, pas besoin de délimiteur (/ dans ton cas) et pas non plus besoin de début et de fin : ^ et $

Eléphant du PHP | 194 Messages

08 avr. 2023, 05:11

J'ai tester ma define dans regex101 elle fonctionne :

Code : Tout sélectionner

define('REGEX_MAIL_INJECTION_SQL', "(?!.*[<>/])^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}");
voici ma vue :

Code : Tout sélectionner

<div class="mt-3"> <label for="exampleFormControlInput1" class="form-label texte"> Mail de contact :</label> <input type="email" class="form-control" id="mail" name="mail" pattern="<?=REGEX_MAIL_INJECTION_SQL?>" placeholder="Mail (obligatoire)" <?php if (isset($mail)) echo 'value="' . htmlspecialchars($mail) . '"'; ?> required> </div> <div class="error mb-3"><?= htmlentities($error['mail'] ?? '', ENT_QUOTES, 'UTF-8')?></div>
et mon controlleur :

Code : Tout sélectionner

<?php require_once(dirname(__FILE__).'/../Configuration/config.php'); require_once(dirname(__FILE__).'/../Public/Utiles/regex.php'); require_once(dirname(__FILE__).'/../Public/Utiles/phpmailer.php'); // Inclure le modele require_once(dirname(__FILE__).'/../Modeles/ChoixContactAccueil.php'); session_start(); // initialise la session $results = array(); // Variable(s) a controlées $code = trim(filter_input(INPUT_GET, 'code', FILTER_SANITIZE_NUMBER_INT)); // Appel de la méthode voirTable pour récupérer les données de la table $choixContactAccueil = new ChoixContactAccueil(); $results = $choixContactAccueil->voirTable(); //On verifie que le formulaire est envoyé if ($_SERVER['REQUEST_METHOD'] == 'POST') { //Champ mail $mail = trim(filter_input(INPUT_POST, 'mail', FILTER_SANITIZE_EMAIL)); if (!preg_match(REGEX_MAIL_INJECTION_SQL, $mail)) { // Si la variable mail ne correspond pas à l'expression régulière // renvoyer un message d'erreur ou faire quelque chose d'autre $error["mail"] = 'L\'adresse email n\'est pas valide'; } if(empty($mail)){ $error["mail"] = 'Le mail doit être renseigné.'; }
avec c'est bout de code affiché, j'obtiens toujours une erreur :

Warning: preg_match(): Unknown modifier '^' in /volume1/Controlleurs/contactAccueil-ctrl.php on line 26

Merci par avance pour vos retours.
@+ Filou

Eléphant du PHP | 194 Messages

08 avr. 2023, 05:22

La c'est le !preg_match qui me bloque si j’enlève le contrôle cela fonctionne.
Comment faire pour que ma regex soit contrôlé coté serveur ?

Merci pour vos retours.
@+ Filou

Avatar du membre
Mammouth du PHP | 1564 Messages

08 avr. 2023, 12:18

preg_match a besoin des délimiteurs et tu dois dire ^ et $

https://www.php.net/manual/fr/function.preg-match.php

Eléphant du PHP | 194 Messages

08 avr. 2023, 20:39

Merci,
effectivement avec le preg_match il faut le délimiteur dans la define du coup j'en ai créer 2

Encore merci pour votre aide.
@+ Filou

Avatar du membre
Mammouth du PHP | 1564 Messages

08 avr. 2023, 20:47

Pas besoin d'en créer deux, rajoute simplement au moment du preg_match :
preg_match("#^" . REGEX_MAIL_INJECTION_SQL . "$#",...