• STATISTIQUES
  • Il y a eu un total de 2 membres et 5754 visiteurs sur le site dans les dernières 24h pour un total de 5 756 personnes!


    1 membre s'est inscrit dans les dernières 24h!


    Membres: 2 608
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] w3challs
    Ce site propose différents types de défis informatiques: piratage, craquage, cryptographie, stég...
    Hacking
    [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accédÃ...
    Challenges
    [FR] Asp-php
    Tutoriaux sur ASP, PHP, ASP.net, XML, SQL, Javascript, HTML, VML - Scripts et ressources pour webmasters - Forums d&#...
    Programmation
    [FR] WeChall
    Audio: 3, Coding: 11, Cracking: 9, Crypto: 18, Encoding: 11, Exploit: 44, Forensics: 1, Fun: 6, HTTP: 6, Image: 8, Java:...
    Challenges
    [EN] social-engineer
    Site dédié au Social Engineering en général.
    Hacking
    [FR] Newbie Contest
    Crackme: 35, Cryptographie: 49, Hacking: 27, Javascript/Java: 17, Logique: 31, Programmation: 23, Stéganographie: 53
    Challenges
    [FR] Microcontest
    Cryptographie: 7, Mathématiques: 8, Image Son Vidéo: 5, Intelligence artificielle: 3, Réseau: 2, Divers: 7, Phy...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!

    €



Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C]Saisie sécurisé?
24-11-2013, 16h47
Message : #1
Hypnoze57 Hors ligne
Web Hacker
*



Messages : 98
Sujets : 13
Points: 28
Inscription : Feb 2012
[C]Saisie sécurisé?
Bonjour à tous, j'essaie depuis quelques jours de créer une saisie le plus sécurisé possible en c. J'ai plusieurs questions sur mon code:

- getchar() est réellement nécessaire?
- Pourquoi la saisie d'une chaine commençant par un chiffre fonctionne elle quand même?

Code:
Code :
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int chiffre, nbChiffres, retourScanf, i=1;
    while(i){
        printf("Saisir un chiffre\n>");
        retourScanf = scanf("%d%n", &chiffre, &nbChiffres);
        scanf("*[^\n]");
        getchar();
        fflush(stdin);
        if(retourScanf==1 && nbChiffres==1){
            printf("Retour: %d\nNombre de chiffre saisis: %d\nChiffre saisie: %d", retourScanf, nbChiffres, chiffre);
            i=0;
        } else {
            printf("Erreur de saisie.\n");
        }
    }
    return 0;
}
Make your own destiny now and forever !
+1 (0) -1 (0) Répondre
24-11-2013, 18h51
Message : #2
Creepy_p0ney Hors ligne
chef des poneys voodoo
*



Messages : 146
Sujets : 9
Points: 24
Inscription : Dec 2011
RE: [C]Saisie sécurisé?
Salut, la saisie d'une chaine commençant par un chiffre fonctionne quand même car le formateur "%s" indique à la fonction qu'elle doit attendre une chaine, c'est à dire, n'importe quel caractère dans la table ascii, et les chiffres sont codés dedans : http://www.asciitable.com/. Pour ton getchar, je n'en sais rien, mais tu peux faire une fonction de saisie avec fgets ou read qui ne depasse pas un certain nombre d'octet, ensuite si tu veux un int, un long ou autre, tu utilises une fonction de conversion. POur plus d'information http://fr.openclassrooms.com/informatiqu...ce-a-fgets (je vais me faire taper sur les doigts)

En esperant avoir pas trop dit de conneries et être comprehensible.
Penser que coder est coder explique-t-il la recursion ?
http://p0neyland.wordpress.com/
+1 (3) -1 (0) Répondre
24-11-2013, 19h32
Message : #3
c4ffein Hors ligne
Membre
*



Messages : 49
Sujets : 2
Points: 5
Inscription : Jul 2013
RE: [C]Saisie sécurisé?
Perso je te conseillerai de faire une version windows de ta fonction avec l api win32, et une version unix-like avec le syscall read pour recuperer la chaine de caracteres ascii, puis de le convertir en int toi meme. Pour t inspirer : http://n-pn.fr/forum/showthread.php?tid=3391
+1 (0) -1 (0) Répondre
24-11-2013, 19h44
Message : #4
supersnail Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,610
Sujets : 72
Points: 466
Inscription : Jan 2012
RE: [C]Saisie sécurisé?
WAT ??!??!

Pourquoi s'e**erder à distinguer windows/*nix ici alors que les fonctions fgets/strtol et compagnie font partie de la lib C standard et son dispo sur tous les OS (y compris win32, c'est dans msvcrt.dll) ?

D'autant plus que le propos ici est de sécuriser un input, pas de recoder fgets ou je ne sais quoi d'autre ...
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (0) -1 (0) Répondre
24-11-2013, 20h36
Message : #5
c4ffein Hors ligne
Membre
*



Messages : 49
Sujets : 2
Points: 5
Inscription : Jul 2013
RE: [C]Saisie sécurisé?
J'ai lu un peu trop vite, je croyais qu'il voulait créer une fonction pour récuperer un nombre. Juste, quand strtol renvoie 0, il suffit de comparer errno a EINVAL et ERANGE pour savoir si l utilisateur a entré 0 ou une chaine malformée?
+1 (0) -1 (0) Répondre
24-11-2013, 20h41
Message : #6
Hypnoze57 Hors ligne
Web Hacker
*



Messages : 98
Sujets : 13
Points: 28
Inscription : Feb 2012
RE: [C]Saisie sécurisé?
Je me suis peux être mal exprimé, je cherche à récupérer un chiffre et un seul. Mais lorsque je rentre une chaine de caractère qui commence par un chiffre, la condition est vérifié. Exemple: 5rfe/'rf('-è-(t0gt-46èunh5bgf
Make your own destiny now and forever !
+1 (0) -1 (0) Répondre
24-11-2013, 21h24 (Modification du message : 24-11-2013, 21h28 par Sh4dows.)
Message : #7
Sh4dows Hors ligne
Tweetos
*



Messages : 293
Sujets : 5
Points: 49
Inscription : Dec 2012
RE: [C]Saisie sécurisé?
(24-11-2013, 20h41)Hypnoze57 a écrit : Je me suis peux être mal exprimé, je cherche à récupérer un chiffre et un seul. Mais lorsque je rentre une chaine de caractère qui commence par un chiffre, la condition est vérifié. Exemple: 5rfe/'rf('-è-(t0gt-46èunh5bgf
Tu demandes à scanf de récupérer un chiffre avec %d:
Code C :

retourScanf = scanf("%d%n", &chiffre, &nbChiffres);
 

Du coup scanf lui en voyant un chiffre à l'indice 0 se dit c'est bon j'ai ce qu'il me demande donc je valide l'opération. Il ne doit même pas se faire ch*** à parcourir le reste de ta chaine..

Donc "5rfe/'rf('-è-(t0gt-46èunh5bgf " est true pour:
Code C :
if(retourScanf==1 && nbChiffres==1){..


Il faut donc que tu peaufines le scanf ou que tu fasses des checks sur un (char *).
Me concernant avec un read() comme cité plus haut, c'est terminé Tongue

Enfin ta variable nbChiffres n'étant pas initialisé et en ayant pour input une valeur (ex. fffffff6) ne validant pas le scanf, nbChiffres est random. Cela peut également être une source d'erreur plus tard Tongue
Code C :

retourScanf = scanf("%d%n", &chiffre, &nbChiffres); // Je rentre "fffffff6"
printf(">>> %d\n", nbChiffres);
 

Et cela me retourne
Code :
Saisir un chiffre
>fffffff6
>>> 4200768
Erreur de saisie.
Faites ce que je dis et non ce que je fais !
+1 (0) -1 (0) Répondre
24-11-2013, 21h49
Message : #8
Hypnoze57 Hors ligne
Web Hacker
*



Messages : 98
Sujets : 13
Points: 28
Inscription : Feb 2012
RE: [C]Saisie sécurisé?
Ah oui je comprend ! Merci pour vos réponses, j'essayerai de corriger sa demain, via les regex sa doit être possible non?
Make your own destiny now and forever !
+1 (0) -1 (0) Répondre
24-11-2013, 21h50 (Modification du message : 24-11-2013, 21h59 par Commodor.)
Message : #9
Commodor Hors ligne
Ho ! Dodgson !
*



Messages : 64
Sujets : 9
Points: 36
Inscription : Nov 2011
RE: [C]Saisie sécurisé?
scanf peut récupérer un seul octet. Si tu comptes en base 10 (donc un seul chiffre, pas nombre) l'appel de atoi convient.

Code :
char num;
int chiffre=0;

scanf("%1[^\n]", &num);  // récupération de 1 octet (et tant qu'on appuie pas sur 'ENTER' (facultatif))
chiffre = atoi(&num);         // ascii to integer

printf("chiffre = %d\n", chiffre);
Hahaha you didn't say the magic word !
+1 (0) -1 (0) Répondre
24-11-2013, 22h37
Message : #10
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C]Saisie sécurisé?
babidibou babouda bidi da bidi bou :
Code C :
int num = 0;
printf ("entrer un chiffre : ");
scanf ("%1d", &num);
printf ("le chiffre est : %d\n", num);

douh ba dibidiba douh :
Code C :
char charnum;
int num = 0;
printf ("entrer un chiffre : ");
scanf ("%[0-9]", &charnum);
num = charnum - 0x30;
printf ("le chiffre est : %d\n", num);

daba douh Wink
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (5) -1 (0) Répondre
25-11-2013, 09h27
Message : #11
Hypnoze57 Hors ligne
Web Hacker
*



Messages : 98
Sujets : 13
Points: 28
Inscription : Feb 2012
RE: [C]Saisie sécurisé?
Merci Commodor !
Et gruik je voulais savoir dans ta ligne : "num = charnum - 0x30;" que signifie 0x30?
Make your own destiny now and forever !
+1 (0) -1 (0) Répondre
25-11-2013, 09h42
Message : #12
supersnail Hors ligne
Éleveur d'ornithorynques
*******



Messages : 1,610
Sujets : 72
Points: 466
Inscription : Jan 2012
RE: [C]Saisie sécurisé?
0x30 = le code ASCII pour le caractère '0' Wink
Mon blog

Code :
push esp ; dec eax ; inc ebp ; and [edi+0x41],al ; dec ebp ; inc ebp

"VIM est merveilleux" © supersnail
+1 (1) -1 (0) Répondre
25-11-2013, 17h38
Message : #13
crown Hors ligne
Membre actif
*



Messages : 52
Sujets : 5
Points: 18
Inscription : Oct 2011
RE: [C]Saisie sécurisé?
(25-11-2013, 09h27)Hypnoze57 a écrit : Merci Commodor !
Et gruik je voulais savoir dans ta ligne : "num = charnum - 0x30;" que signifie 0x30?

Les chiffres de 0-9 sont représentés en hex par 0x3[0-9] donc en faisant la différence entre, par exemple : 0x39 (9 en décimal) et 0x30, tu obtiens le nombre en hex == à celui en décimal.
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut