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 :

Entrer une chaîne de caractères de façon sécurisée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut Entrer une chaîne de caractères de façon sécurisée
    Je connais la fonction fgets mais je me demandais s'il n'existait pas une fonction peut etre plus sécurisé pour rentrer une chaine de caractere .
    Si je demande d'entrer un prenom par exemple ,cette fonction comptabiliserai le nombre de caractere rentré au clavier et allouera dynamiquement juste ce qu'il faut d'emplacement memoire pour le stocker . Peut etre un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    define MAX 30
    int main(void){
     char nom[MAX];
     int nb;
     
     printf("Votre prenom?");
     scanf("%s",nom);
     nb=strlen(nom);
     malloc(sizeof(char)*nb;
     printf("Votre prenom est :%s\n",nom);
    return 0;}
    Merci de votre aide

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour à toi aussi
    Citation Envoyé par chris7522 Voir le message
    Je connais la fonction fgets mais je me demandais s'il n'existait pas une fonction peut etre plus sécurisé pour rentrer une chaine de caractere .
    Tout dépend de ce que tu entends par "sécurisé"...

    Citation Envoyé par chris7522 Voir le message
    Si je demande d'entrer un prenom par exemple ,cette fonction comptabiliserai le nombre de caractere rentré au clavier et allouera dynamiquement juste ce qu'il faut d'emplacement memoire pour le stocker .
    Mouais. Enfin si on n'entre pas plus de 29 caractères et surtout si, en plus de corriger l'erreur de syntaxe avec la parenthèse manquante (je te rappelle qu'on attend des intervenants un code qui compile), tu récupères la zone allouée par malloc() !!!!!!!

    Et (cela va habituellement sans dire mais apparemment ici cela ira encore mieux en te le disant) si tu recopies dans la zone allouée ce qui a été saisi dans la zone temporaire....

    Perso si c'est pour le plaisir de programmer alors j'aurais plutôt vu un truc basé sur une lecture en boucle de stdin caractère par caractère et stockage avec allocation et réallocation au fur et à mesure.
    Et bien entendu, une allocation un petit peu optimisée c'est à dire de N et N (et non de 1 en 1 !!!)

    Maintenant si c'est pour de l'opérationnel, alors tu as getline() qui fait exactement ça...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    C'est vrai que j'ai oublié l'essentiel , bonjour a toutes et a tous , surtout a toutes que malheureusement je n'entends jamais. Et merci a toi , de repondre a mes questions de debutant

  4. #4
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour,
    En plus des remarques faites (fuite mémoire en cours d'exécution du programme, dû au fait que vous allouez de la mémoire dans le vide "si entre-temps vous avez ajouté la parenthèse fermante manquante"; sans oublier le # du define, mais également, la vulnérabilité que vous avez créée par l'utilisation du printf("Votre prenom?"); avec une chaîne de caractères non contenus dans une variable et qui peut tout à fait être remplacée/corriger par puts) et peut importer votre niveau débutant ou pas, vous êtes capable de lire et comprendre à votre niveau de débutant; pourquoi le compilateur ne compile pas ou ne génère pas le fichier exécutable souhaité à cause des messages d'erreur de ce genre "unknown type name 'define'.

    En ce qui concerne la sécurité des saisies, il va falloir attendre un peu et avoir des notions solides avant d'aborder le sujet ou comment l'on procède.
    À bientôt,

  5. #5
    Membre confirmé
    Homme Profil pro
    Deficient visuel
    Inscrit en
    Mai 2019
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Deficient visuel

    Informations forums :
    Inscription : Mai 2019
    Messages : 216
    Par défaut
    Merci beaucoup d'avoir prit le temps de me repondre

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Euh, printf("Votre prenom?");, bien que pas forcément une bonne pratique, ne contient pas de vulnérabilité... (par contre, selon la plate-forme, il est possible qu'il s'affiche trop tard)
    Je n'en dirais pas autant du scanf("%s") qui le suit (vulnérabilité de saisie sans limite de taille). Pour ça il vaut mieux utiliser fgets() ou, sur une plate-forme compatible, getline().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 18h01
  3. [Debutant(e)] Analyse d'une chaîne de caractères
    Par maire106 dans le forum Langage
    Réponses: 6
    Dernier message: 22/03/2004, 15h04
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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