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

Langage PHP Discussion :

regex pour les mots de passe


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Symfony - CMS Wordpress - Zend
    Inscrit en
    Septembre 2011
    Messages
    306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Symfony - CMS Wordpress - Zend
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 306
    Points : 101
    Points
    101
    Par défaut regex pour les mots de passe
    Bonjour à tous,

    Voici mon cas: je voudrait valider un champ de type mot de passe.

    Voici ce que je fait pour que au minimum un des caractères suivant soit présent:

    • Une majuscule
    • Une minuscule
    • et ces cacharactère spéciaux @#$%


    le regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])
    je poursuit avec une autre contrainte la voici:

    je voudrait que les tous les caractères ne se répète pas plus de deux fois(ex: 111 = not match, 11 = match)

    voic mon regex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=[a-zA-Z0-9@#$%]{1,2}$)
    Je voudrait pour combiner ces deux règles sans succès

    Merci d'avance pour vos réactions.

  2. #2
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Je pense que dans ton cas il faut procéder en 2 étapes. En effet, il faut contrôler qu'un caractère n'est pas suivi par plus d'une fois par ce même caractère et non pas un caractère de la même classe.
    1 - contrôle qu'il n'y a pas de répétitions de plus de 2 fois
    2 - contrôle que chaque typologie de caractères est utilisée.

    Pour la partie 1 :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $pattern = "/(\w)(?=\\1{2,})/";
    $s1 = "112334455";
    print preg_match($pattern,$s1);
    print "<br/>";
    $s1 = "1122334455";
    print preg_match($pattern,$s1);
    print "<br/>";
    $s1 = "11223334455";
    print preg_match($pattern,$s1);
    print "<br/>";
    $s1 = "11223344555";
    print preg_match($pattern,$s1);
    print "<br/>";

    Par contre cela fonctionne à l'inverse. Si le preg_match renvoie true alors c'est pas bon.

  3. #3
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Essaie ça. Il reste à contrôler la longueur mini / maxi de la chaine.

    Code php : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    <?php
    function toto($string)
    {
     $low = "a-z";
     $upp = "A-Z";
     $cha = "@§&";
     $fig = "0-9";
     
     //--- Teste si il y a plus de 2 répétitions
     $pattern = "/(\w)(?=\\1{2,})/";
     if (preg_match($pattern,$string)==0)
     {
      //--- Pas plus de 2 répétitions => Teste si les caractères sont autorisés
      $pattern2 = "/^[$low$upp$cha$fig]+$/";
      if (preg_match($pattern2,$string)==1)
      {
       //--- Que des caractères autorisés => Teste si un ensemble de caractères n'est pas utilisé
       $pattern3 = "/^(([^$low]+)|([^$upp]+)|([^$cha]+)|([^$fig]+))$/";
       if (preg_match($pattern3,$string)==0)
       {
        //--- Tous les ensembles de caractères sont utilisés
        return true;
       }  
      }
     }
     return false;
    }
    function titi($string)
    {
     print toto($string) ? "ok" : "ko";
     print "<br/>";
    }
    print titi("aabbAAccC@01");   // ok
    print titi("aA@0");           // ok
    print titi("aabbAAccC@");     // ko => manque 0-9
    print titi("aabbAAccC_@01");  // ko => _ non autorisé
    print titi("aabbAAcccC_@01"); // ko => ccc répété 3 fois
    print titi("aabbaaccd@01");   // ko => manque A-Z
    print titi("AABBAACCD@01");   // ko => manque a-z
    print titi("AABBAACCD01");    // ko => manque @§&

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    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 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Citation Envoyé par sinzen Voir le message
    • Une majuscule
    • Une minuscule
    • et ces cacharactère spéciaux @#$%
    • Un chiffre


    le regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])
    Merci d'être précis et exhaustif dans ta description. D'autre part, cette pattern devrait être ancrée au début de la chaîne avec ^, car si la chaîne ne répond pas aux critères, la pattern sera testée inutilement à toutes les positions de la chaîne de caractères avant d'échouer.

    Citation Envoyé par sinzen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=[a-zA-Z0-9@#$%]{1,2}$)
    Ceci ne détectera pas un caractère répété et encore moins 2. La pattern pour un caractère répété utilise un groupe de capture et une référence à cette capture. Par exemple: (.)\1. Donc pour deux répétitions, ça sera (.)\1{2}.
    Pour l'interdire, au lieu d'utiliser un test avant (lookahead), utilise un test avant négatif (negative lookahead) (?!...) que tu peux agglutiner aux autres comme tu l'as fait depuis le début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])(?!.*(.)\1{2})
    Aussi, si tu en as terminé avec tes conditions, tu peux très bien sortir l'une d'elle de son test avant (uniquement parmi celle qui sont positives), par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])(?!.*(.)\1{2}).*\d
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%])(?!.*(.)\1{2}).*[a-z]
    À propos des mots de passe en général, inutile de se torturer avec des mélanges biscornus de caractères, car en définitive et au grand damne de certains: c'est la taille qui compte.

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    À propos des mots de passes en général, inutile de se torturer avec des mélanges biscornus de caractères, en définitive et au grand damne de certain: c'est la taille qui compte.
    Oui, il est préférable de calculer l'entropie (de Shannon) et d'autoriser les mots de passe supérieurs à un certain seuil, plutôt que d'imaginer des méthodes de validation incertaines.

Discussions similaires

  1. [CSS] Petits conseils pour les redimensionnements
    Par GLDavid dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 07/08/2006, 18h44
  2. J'ai un petit probleme pour les if et else
    Par Nadirov dans le forum Delphi
    Réponses: 9
    Dernier message: 02/08/2006, 14h58
  3. Petit sondage pour les cplusplusiens
    Par Float* dans le forum C++
    Réponses: 26
    Dernier message: 28/03/2006, 11h24
  4. petit conseil pour les index
    Par fpouget dans le forum Langage SQL
    Réponses: 11
    Dernier message: 10/12/2005, 05h39
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 22h45

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