Entrada de datos de manera segura en C++

última actualización el 2 de agosto de 2009, 19:23 por Carlos-vialfa
Publicado por Carlos-vialfa

Entrada de datos de manera segura en C++






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.

PD: El artículo original fue escrito por HACKER 712, contribuidor de CommentCaMarche
Mejores respuestas para « Entrada de datos de manera segura en C++ » en :
Volver más seguro a Gmail VerVolver más seguro a Gmail De manera predeterminada las conexiones a Gmail no se hacen de manera segura: la conexión es en http simple, lo que significa que la información puede ser fácilmente interceptada. Para solucionar este problema, sigue...
Copia de respaldo y restauración de bases de datos Mysql VerEn este artículo veremos la manera más sencilla de hacer una copia de respaldo y luego restaurar una base de datos Mysql. Copia de respaldo Para hacer una copia de respaldo de una base de datos se recomienda crear un dump. Para hacer un dump de...
Recuperar datos dañados de un CD/DVD VerRecupere los datos dañados de un CD/DVD con CDCheck En primer lugar descargue CDCheck. Este programa gratuito de Mitja Perko, analiza los datos de un CD/DVD y los recupera fácilmente. Poner CDCheck en español Ejecute el programa y vaya a:...
Descargar Darik's Boot And Nuke VerDarik's Boot And Nuke es un disco de arranque que nos permitirá eliminar de una manera segura, toda la información contenido en el disco duro de nuestro ordenador. Darik's Boot and Nuke se encargará automáticamente de eliminar completamente todo el...
Introducción - Bases de datos Ver¿Qué es una base de datos? Una base de datos (cuya abreviatura es BD) es una entidad en la cual se pueden almacenar datos de manera estructurada, con la menor redundancia posible. Diferentes programas y diferentes usuarios deben poder utilizar estos...
Puerto serial y puerto paralelo VerIntroducción a los puertos de salida/entrada Los puertos de salida/entrada son elementos materiales del equipo, que permiten que el sistema se comunique con los elementos exteriores. En otras palabras, permiten el intercambio de datos, de aquí el...
Almacén de datos y tienda de datos VerAlmacén de datos Los distintos datos del sistema de información de inteligencia se almacenan de manera intermedia en un sitio llamado almacén de datos (en inglés datawarehouse). El almacén de datos es el único lugar donde se acumulan todos los datos...