Em seus programas, você tem, inevitavelmente, necessidade de pedir informações para o usuário. Essas informações são coletadas, em C++, com o objeto "cin". Se você não protege essas entradas, então o seu programa é susceptível de ser vítima de um "buffer overflow".
Na verdade, se o número de caracteres digitados excede o tamanho do buffer inicialmente previsto, então os últimos dados substituem outros dados na pilha e, afetam falsos dados aos registros ESP e EBP.
Sem entrar em detalhes, o cracker poderá injetar um "código shell" em seu programa e fazer o que quiser.
1. Proteger suas digitações com o método "get()"
Você pode proteger estas entradas de diferentes maneiras. Por exemplo, utilizar o método membro "get ()" do objeto "cin" pode ser uma solução.
#include <iostream>
int main() {
char texto[100];
cin.get(texto, 100); //primeiro parâmetro: lá onde se digita segundo: tamanho máximo da entrada
return 0;
}
Este exemplo ilustra o uso de
cin.get.
Se o texto digitado exceder o tamanho alocado, os caracteres em excesso serão ignorados.
2. Proteger suas digitações com o método "getline()"
Este método funciona como o
get(), mas ele exclui o caractere no final do buffer.
Na verdade, para validar um texto, o usuário pressiona a tecla "Enter", que corresponde ao caractere "
\n".
getline() remove este caractere final, o que é útil caso você não queira pular a linha depois da digitação.
3. Droga, não funciona...
Veja um código que não funciona corretamente:
#include <iostream>
using namespace std;
int main() {
char entree[100];
int choix;
cout << "Entre um número:" ;
cin >> choix;
cout << "Entre um texto:";
cin.get(texte, 100);
cout << "Entradas terminadas!";
return 0;
}
Na verdade, a segunda entrada não é executada, e a mensagem "Entradas terminadas!" aparece, apesar de não termos sido convidados a inserir textos.
Como resolver esse problema?
Você deve usar o método "
ignore( " do objeto "
cin".
4. O método "ignore()"
Este método permite ignorar determinados caracteres de uma string. Veja seu uso no código-fonte antes de:
#include <iostream>
using namespace std;
int main() {
char entrada[100];
int escolha;
cout << "Entre um número:" ;
cin >> choix;
cout << "Entre um texto: ";
cin.ignore(1, '\n'); //ignore o caractere de entrada que, validava antes da entrada .
cin.get(texte, 100);
cout << "Entradas terminadas!";
return 0;
}
Com este método, o caractere de entrada é ignorado e o problema resolvido.
Tradução feita por Lucia Maurity y Nouira
A ver igualmente
Comunidade de assistência e de conselho.
Artigo original publicado por
HACKER 712. Tradução feita por
pintuda.