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

C Discussion :

Problème dans algorithme de test de saisies de mot de passe


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut Problème dans algorithme de test de saisies de mot de passe
    Bonjour,

    voila, je travaille sur un système embarqué ( donc je suis limité en memoire)auquel on peut intervenir sur un ecran de PC et il y a 2 types d'utilisateurs, l'administrateur qui peut faire des changements de config et l'utilisateur normal qui ne peut que voir les config.

    j'ai fait une fonction Users_mode() où il y a un test avec des if et un while ( il y a 5 tentatives de tests ), j'ai utilisé un scanf , je sais pas si c'est l'ideal ? Aurais-je dû utiliser un switch ?


    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
    33
    34
    35
    36
    37
    38
    39
    40
     
    void Users_mode()
    {
    unsigned char choiceuser; 
    unsigned char pass[5]; 
    int num_tries =0;  
    typeutil=0; //var. testé plus loin pour afficher un type de menu selon l'utilisateur
    printf("Would you like to enter in administrator mode (Y/N) ?\n\n");  
     // scanf("%c",&choiceuser);
      choiceuser=getchar0();  //0705  
       if((choiceuser=='Y')||(choiceuser=='y'))     
       {  
         while (num_tries<5)
         {
         if (num_tries==0)
         printf("You must enter a password  : \n\n"); 
         else 
         printf("You must enter a valid password  : \n\n");  
         scanf("%s", pass);
         num_tries++; 
     
         if(strcmp(pass, "abcd") == 0)
                {
                typeutil = 1;
                printf("You are in administrator mode \n"); 
                num_tries=5;  //flag pour dire de sortir
                }
            else
                {
                typeutil = 0;
                printf("Not correct password \n\n");
               }
         }
     
       }
       if((choiceuser=='N')||(choiceuser=='n'))
       {
    	typeutil = 0;
       }
    }


    J'ai un probleme lorsque je saisie un nombre de caractères superieur à 'abcd' par exemple si je tape 'efskjdhl' alors automatiquement je ne repasse plus dans le while et je sors de ma fonction alors que num_tries ne vaut que 1 ??

    Mon problème c'est, je pense, le scanf il fait outre passer le while ?

    J'ai 3 questions:

    Ma 1ère question comment faire en sorte de pouvoir faire les 5 tests quoi que l'on tape sur le clavier et bien sur sortir de la fonction dès qu'on aura saisie 'abcd' ?

    Ma 2ème question quel est l'algorithme par excellence pour faire des test de saisies claviers de manière profesionnelle et avec des conditions pour tester un certains nombres de fois ou indefinement jusqu'à saisir le bon mot de passe par exemple?

    Ma 3 ème question dans des fonctions de tests quand recours-t'on à l'utilisation de getchar() et de switch-case() ?


    Merci

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kao,

    Tu as réservé 5 caractères pour pass, donc 4 caractères effectifs + le 0 terminal.

    Si tu en entres plus, ça va écraser la mémoire qui suit, comportement indéfini.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Aliveli
    j'ai fait une fonction Users_mode() où il y a un test avec des if et un while ( il y a 5 tentatives de tests ), j'ai utilisé un scanf , je sais pas si c'est l'ideal ?
    Il ne faut pas utiliser scanf() si on est pas un expert de cette fonction.

    http://xrenault.developpez.com/tutoriels/c/scanf/

    Pour les autres, je recommande fgets() ou de se construire ses fonctions de lectures sécurisées.

    http://emmanuel-delahaye.developpez.com/inputs.htm

    Ca devrait répondre à toutes tes questions d'un coup.
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Emmanuel, j'ai lu le lien ci-dessus. Tu as fait une faute de frappe :
    Mais cette limite est bien supérieure (voire indéterminée) sur une machine unixoide ou Windows NT. Il est donc prudent de ne faire aucune hypothèse sur une éventuelle limtation.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    Emmanuel, j'ai lu le lien ci-dessus. Tu as fait une faute de frappe :
    Corrigé, merci. Si tu en vois d'autres, n'hésite pas (par MP, car inutile de polluer le forum avec, tout le monde sait que je fais des fautes de frappes).
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Ok,

    Je vois si l'utilisateur saisie sans faire attention un ou deux caracteres en trop alors la fonction ne marche pas comme il le faut, pourtant un probleme de depassement de mémoire sur un tableau ne doit pas influencer le while non et l'utlisateur devrait pouvoir encore utiliser ses 4 tentatives ? Comment peut-t-on remedier à ça dans ma fonction ?

    Merci

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Aliveli
    Je vois si l'utilisateur saisie sans faire attention un ou deux caracteres en trop alors la fonction ne marche pas comme il le faut, pourtant un probleme de depassement de mémoire sur un tableau ne doit pas influencer le while non et l'utlisateur devrait pouvoir encore utiliser ses 4 tentatives ? Comment peut-t-on remedier à ça dans ma fonction ?
    Un dépassement mémoire implique un comportement indéterminé. Tout peut arriver. De plus, un usage mal maitrisé des fonctions de saisies (getchar(), scanf()), entraine un instabilité du code allant jusqu'à la boucle infinie...

    En ce qui concerne les saisies, il n'y a pas de bricolage ou de demi-mesures qui tiennent. Il faut résoudre le problème franchement et définitivement. Ton code écrit avec des fonctions sécurisées

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module IO

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    #include "ed/inc/io.h"
     
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
     
    int login (void)
    {
       /* var. testé plus loin pour afficher un type de menu selon l'utilisateur */
       int typeutil = 0;
     
       printf ("Would you like to enter in administrator mode (Y/N) ?\n\n");
       {
          int choiceuser = tolower (get_c ());
     
          switch (choiceuser)
          {
          case 'y':
             {
                unsigned char pass[5];
                int num_tries = 0;
                int logged = 0;
     
                while (!logged && num_tries < 5)
                {
                   if (num_tries == 0)
                      printf ("You must enter a password  : \n");
                   else
                      printf ("You must enter a valid password  : \n");
                   get_s (pass, sizeof pass);
                   num_tries++;
     
                   if (strcmp (pass, "abcd") == 0)
                   {
                      typeutil = 1;
                      printf ("You are in administrator mode \n");
                      /* flag pour dire de sortir */
                      logged = 1;
                   }
                   else
                   {
                      typeutil = 0;
                      printf ("Incorrect password \n\n");
                   }
                }
             }
             break;
     
          case 'n':
             typeutil = 0;
          }
       }
       return typeutil;
    }
     
    int main (void)
    {
       int admin = login ();
     
       if (admin)
       {
          printf ("Logged as an admin\n");
       }
       else
       {
          printf ("Logged as a user\n");
       }
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre du Club
    Profil pro
    Developer
    Inscrit en
    Juin 2004
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developer

    Informations forums :
    Inscription : Juin 2004
    Messages : 194
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Merci mais voila j'ai tester ta correction avec DEV C++ mais j'ai une erreur a cette ligne:

    int choiceuser = tolower (get_c ());


    Je ne comprend pas ?

    Merci

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Aliveli
    Bonjour,

    Merci mais voila j'ai tester ta correction avec DEV C++ mais j'ai une erreur a cette ligne:

    int choiceuser = tolower (get_c ());


    Je ne comprend pas ?

    Merci
    Quelle est l'erreur , essaie avec getc() au lieu de get_c().

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Aliveli
    Merci mais voila j'ai tester ta correction avec DEV C++ mais j'ai une erreur
    C'est normal. J'ai donné une solution sécurisée. Il faut ajouter mon code de bibliothèque qui se trouve en :

    http://emmanuel-delahaye.developpez.com/clib.htm

    ou écrire ses propres fonctions de saisies.

    http://emmanuel-delahaye.developpez.com/inputs.htm

    Si tu mets les fonctions standards, tu va retomber dans des problèmes d'instabilité du code...
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salseropom
    Quelle est l'erreur , essaie avec getc() au lieu de get_c().
    Bah, non, justement. Tu n'as pas lu mes réponses...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/01/2011, 12h34
  2. saisie de mot de passe dans un JOptionPane
    Par Solly dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 05/03/2010, 14h29
  3. Caractères anormaux dans la saisie de mot de passe
    Par corenitec dans le forum Windows XP
    Réponses: 2
    Dernier message: 27/08/2007, 17h48
  4. cacher la saisie du mot de passe
    Par Antoine_1977 dans le forum Modules
    Réponses: 5
    Dernier message: 23/09/2005, 18h13

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