• [^] # Re: En quel langage

    Posté par . En réponse au message Parser un fichier ASCII. Évalué à 3.

    le probleme de securite il existe pour le %s ou tu dois allouer un espace memoire de taille equivalente a la longueur de la chaine que tu vas rencontrer dans ton fichier.
    Or si tu supposes que cette chaine dois recevoir une date de format JJMMAAAA et que quelqu'un s'amuse a modifer ton fichier pour remplacer la date par une chaine plus longue, tu te places dans la situation de depassement de buffer: tes donnees seront ecrites dans une zone memoire non allouee par ton application, autorisant l'execution eventuel de code ( je ne suis pas assez cale pour detailler le comment de cette execution)

    la solution serait:
    1) utiliser un buffer intermediaire de taille fixe : char *Buffer[BUFSIZ];

    2) lire une ligne entiere en bouclant une serie de

    fgets(Buffer,BUFSIZ,fp);
    chaine=realloc(chaine,strlen(chaine)+strlen(Buffer)+1)
    strncat(chaine,Buffer,strlen(Buffer));

    jusqu'a ce que fgets retourne NULL (ne pas oublier de prendre les precautions necessaires avec realloc pour eviter un eventuel NOMEM)

    3) lire tes trois premiers champs a coup de sscanf, verifier qu'ils ont bien ete lus et retranscrits dans leur variable respective, puis verifier que strlen(chaine)-1-2-4==8, c'est a dire que la taille de la chaine de caracteres censee representer ta date est bien de 8 octets