Entrada de datos de manera segura en C++

Noviembre 2016






En los programas que realices, inevitablemente tendrás que solicitar información al usuraos. Esta información es recolectada en C++ a través del objeto “cin”. Si no proteges estas entradas, entonces tus programas pueden ser victima de un “buffer overflow”.

Efectivamente, si el número de caracteres entrados supera el tamaño del buffer inicialmente previsto, los últimos datos aplastan otros datos en la pila, y se asignan datos falsos a los registros ESP y EBP.

Sin entrar en el detalle, un cracker puede introducir un “shell code” en tus programas, y hacer lo que desee.

1. Proteger la entrada de datos gracias al método “get()”


Puedes proteger estas entradas de datos de diferentes formas. Por ejemplo, puede ser una solución utilizar el método “get()” del objeto “cin”.

#include <iostream>

int main() {

char texto[100];
cin.get(texto, 100);  //primer parámetro: donde se ingresan los datos  segundo: tamaño máximo
de la entrada

return 0;

}


Este ejemplo ilustra el uso de cin.get.
Si el texto entrado supera el tamaño asignado, los caracteres sobrantes serán ignorados.

2. Proteger la entrada de datos gracias al método “getline()”


Este método funciona como get(), pero elimina el carácter de fin de buffer.
Efectivamente, para validar un texto, el usuario presiona la tecla Enter, que corresponde al carácter '\n'.
getline() elimina este carácter, lo que resulta practico si no se desea retornar a la línea después de una entrada de datos.

3. Un código que no funciona correctamente


A continuación un código que no funciona correctamente:

#include <iostream>

using namespace std;

int main() {

char entrada[100];
int selección;
cout << "Ingrese un número:" ;
cin >> seleccion;
cout << "Ingrese texto: ";
cin.get(texto, 100);
cout << "Ingreso de datos terminado!";
return 0;
}


El segundo ingreso de datos no es ejecutado, y aparece el mensaje “Ingreso de datos terminado!”, y no se nos ha solicitado el ingreso de texto.

Cómo solucionar este problema?

Utilizando el método "ignore()" del objeto "cin".

4. El método "ignore()"


Este método permite ignorar ciertos caracteres de una cadena. A continuación cómo utilizarlo en el código fuente precedente:

#include <iostream>

using namespace std;

int main() {

char entrada[100];
int seleccion;
cout << "Ingrese un numero:" ;
cin >> selección;
cout << "Ingrese texto: ";
cin.ignore(1, '\n');    //ignore el carácter de entrada, que antes validaba el ingreso de datos.
cin.get(texto, 100);
cout << "Ingreso de datos terminado!";
return 0;
}


Con este método, el carácter de entrada es ignorado, y el problema resuelto.

Consulta también :
El documento «Entrada de datos de manera segura en C++» de CCM (es.ccm.net) se encuentra disponible bajo una licencia Creative Commons. Puedes copiarlo o modificarlo siempre y cuando respetes las condiciones de dicha licencia y des crédito a CCM.