La saisie sécurisée en C++

Décembre 2016


La saisie sécurisée en C++










Dans vos programmes, vous avez inévitablement besoin de demander des informations à l'utilisateur. Ces informations sont recueillies, en C++ grâce à l'objet "cin". Si vous ne sécurisez pas ces entrées,
alors votre programme est susceptible d'être victime d'un "buffer overflow".

En effet, si le nombre de caractères entrés dépasse la taille du buffer initialement prévue, alors les dernières données écrasent d'autres données sur la pile, et affectent de fausses données aux registres ESP et EBP.

Sans rentrer dans les détails, le cracker va pouvoir injecter un "shell code" dans votre programme, et
ainsi en faire ce qu'il veut.

1. Sécuriser ses saisies grâce à la méthode "get()"


Vous pouvez sécuriser ces saisies de différentes façons. Par exemple, utiliser la méthode membre "get()" de l'objet "cin" peut être une solution.

#include <iostream>

int main() {

char texte[100];
cin.get(texte, 100);  //premier paramètre : la où va la saisie  second : taille max de saisie

return 0;

}


Cet exemple illustre l'utilisation de cin.get.
Si le texte entré dépasse la taille allouée, les caractères en trop seront ignorés.

2. Sécuriser ses saisies grâce à la méthode "getline()"


Cette méthode fonctionne comme get(), mais elle supprime le caractère de fin de tampon.
En effet, pour valider un texte, l'utilisateur appuie sur la touche "Entrée", qui correspond au caractère '\n'.
getline() supprime ce caractère de fin, ce qui est pratique si l'on ne veut pas retourner à la ligne
après une saisie.

3. Mince, ça marche pas...


Voici un code qui ne fonctionne pas correctement :

#include <iostream>

using namespace std;

int main() {

char entree[100];
int choix;
cout << "Entrez un nombre :" ;
cin >> choix;
cout << "Entrez un texte : ";
cin.get(texte, 100);
cout << "Saisies terminées !";
return 0;
}
En effet, la deuxième saisie n'est pas exécutée, et le message "Saisies terminées !" s'affiche, alors que nous n'avons pas été invité à rentrer du texte.

Comment palier à ce problème ?

Il faut utiliser la méthode "ignore()" de l'objet "cin".

4. La méthode "ignore()"


Cette méthode permet d'ignorer certains caractères d'une chaîne. Voici son utilisation dans le code source précédant :

#include <iostream>

using namespace std;

int main() {

char entree[100];
int choix;
cout << "Entrez un nombre :" ;
cin >> choix;
cout << "Entrez un texte : ";
cin.ignore(1, '\n');    //ignore le caractère d'entrée, qui validait auparavant la saisie.
cin.get(texte, 100);
cout << "Saisies terminées !";
return 0;
}
Avec cette méthode, le caractère d'entrée est ignoré, et le problème résolu.

A voir également :

Ce document intitulé «  La saisie sécurisée en C++  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.