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
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
[^] # Re: En quel langage
Posté par Anonyme . En réponse au message Parser un fichier ASCII. Évalué à 3.
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