Faça uma pergunta »

Digitar com segurança em C++

Agosto 2015



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
Para uma leitura offline, é possível baixar gratuitamente este artigo no formato PDF:
Digitar-com-seguranca-em-c.pdf

Veja também

Na mesma categoria

Secure input in C++
Por deri58 em 21 de janeiro de 2013
Entrada de datos de manera segura en C++
Por Carlos-vialfa em 2 de agosto de 2009
La saisie sécurisée en C++
Por HACKER 712 em 25 de julho de 2009
Artigo original publicado por HACKER 712. Tradução feita por pintuda.
Este documento, intitulado « Digitar com segurança em C++ »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.