IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Soucis contrôle Regex


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 48
    Par défaut Soucis contrôle Regex
    Bonjour à tous,

    J'ai un souci concernant le contrôle d'un Regex. Lorsque je met un <script>, ou autre caractère non autorisé, ma regex est censée stopper le script avec un die() et ne rien insérer dans la BDD. Elle marche parfaitement sur tous les champs qui l'utilise à part sur un ! je comprends pas pourquoi

    Là où ça ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public function update_presentation()
    	{
    		if ( isset($_POST['content']) && !empty($_POST['content']) ) {
    			$presentation = htmlspecialchars($_POST['content']);
     
    			if ( RegexControl ::authorizeParagraphe($_POST['content']) ) {
    				$compteur_mots = str_word_count($presentation);
    				if ( $compteur_mots >= 30 ) {
    					if ( $compteur_mots <= 65 ) {
     
    						$param = array(
    							"presentation" => $presentation
    						);
     
    						$this -> homeManager -> update($param);
    						die("Modification effectuée avec succès !");
     
    					}
    					else {
    						die("Erreur: nombre de mots supérieur à la limite autorisée (65 max)");
    					}
    				}
    				else {
    					die("Erreur: nombre de mots insuffisants (" . $compteur_mots . "). Le texte doit contenir au moins 30 mots");
    				}
    			}
    		}
    		else {
    			die("Erreur: la variable est vide et/ou n'existe pas");
    		}
    	}
    La regex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static function authorizeParagraphe($input){
    		$re = '/^[\w\s,\-"\'.():?!ÉÈêéèàîùç$\/]+$/ixm';
    		if ( preg_match($re , $input) ) {
    			return true;
    		}
    		else {
    			die ("Le texte contient des caractères interdits");
    		}
    	}

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu as un exemple de texte qui devrait passer et qui ne passe pas ?

    Citation Envoyé par LO88ra Voir le message
    ma regex est censée stopper le script avec un die()
    C'est violent comme traitement quand même. "Utilisateur, tu as écrit des choses non autorisées, ton application va maintenant planter." (*) Un petit return false; ne serait-il pas plus adéquat ?

    (*) Bon, j'avoue, on a tous un jour ou l'autre rêvé de pouvoir écrire un message d'erreur de ce genre là.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2019
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2019
    Messages : 48
    Par défaut
    Bonjour Celira,

    J'ai trouvé d'où venez le problème, j'ai rajouté un trim(), et du coup cela a fonctionné !
    Pour le die(), je préfère stopper le script, après ce n'est pas dérangeant pour l'utilisateur vu que ce sont des requêtes ajax, il ne quitte pas la page

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Ta regex totalitaire n'en est pas moins une vraie passoire pour deux raisons:
    • tu utilises le modificateur m, ce qui change la signification des ancres ^ et $ qui vont alors matcher le début et la fin de ligne (en lieu et place du début et de la fin de la chaîne). Conséquence, si je m'amuse, par un procédé directement inspiré par Belzébuth via la console javascript de mon navigateur, à envoyer une chaîne de plusieurs lignes dont une seule vérifie ta pattern, je peux faire passer strictement n'importe quoi. Exemple:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      $str = "<°))))))>\nabc\n<((((((°>";
      $re = '/^[\w\s,\-"\'.():?!ÉÈêéèàîùç$\/]+$/ixm';
      var_dump(preg_match($re, $str)); // int(1)
    • ta classe de caractères contient des caractères accentués, qui en utf8 sont encodés sur plusieurs octets (voir https://www.utf8-chartable.de/), or tu n'utilises pas le modificateur u qui, entre autres choses, précise que la pattern doit être lue en utf8, ce qui fait que chacun des octets qui composent ces caractères accentués sont à l'heure actuelle vus comme indépendants de la lettre à laquelle ils sont supposés appartenir. Ce qui fait que ta classe de caractères munie du quantificateur + peut se livrer à n'importe quelle combinaison de ces octets "libres":
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $str = "\xa7\xa7\xa7"; // A7 est le deuxième octet qui compose le ç en utf8 (C3 A7)
      var_dump(preg_match($re, $str)); // int(1)
      Autre conséquence, ces caractères accentués étant vus comme de simple octets libres et sans ordre particulier et pas comme des code point unicode représentant des lettres, le modificateur i sera inopérant en ce qui les concerne.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      var_dump(preg_match('/É/i', 'é')); // int(0)
      var_dump(preg_match('/É/iu', 'é')); // int(1)


    Je te propose:
    • de retirer le modificateur m, et d'utiliser systématiquement \A et \z comme ancres pour désigner le début et la fin de la chaîne (ce qui évite des ennuis liés à une subtilité de $).
    • d'ajouter le modificateur u pour gérer l'encodage utf8 de la pattern.
    • d'utiliser éventuellement des classes de caractères unicode moins restrictives qu'une liste de caractères isolés, par exemple $re = '~\A [\p{Latin}\s0-9"\',.:?!()$/-]+ \z~xu'; (voir les Unicode character properties http://pcre.org/pcre.txt)

Discussions similaires

  1. Souci de Regex
    Par ApocalypseDuck dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2009, 16h45
  2. soucis de regex
    Par Miaou le chat thon dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/12/2008, 15h32
  3. [RegEx] Souci des regex pour les puces donc erreurs W3C
    Par retour dans le forum Langage
    Réponses: 10
    Dernier message: 04/10/2008, 15h09
  4. Soucis avec regex.replace
    Par elric47 dans le forum ASP
    Réponses: 1
    Dernier message: 29/04/2008, 23h33
  5. [REGEX] Souci de regex
    Par LE NEINDRE dans le forum Langage
    Réponses: 5
    Dernier message: 27/02/2006, 09h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo