tecnologico - advertencia: la función get es peligrosa
paracetamol (7)
Como dice el artículo de Wikipedia , es intrínsecamente inseguro porque todo lo que necesita es un char *
como argumento.
Esto es peligroso porque no hay forma de que el método sepa cuánto espacio se ha asignado a ese char *
en cada situación. Por lo tanto, gets
comporta como si tuviera un cheque en blanco para escribir tantos datos como sea posible, lo que podría dar lugar a sobrepasamientos del búfer.
La alternativa es fgets
que toma no solo la matriz de caracteres, sino la longitud máxima y el puntero de la secuencia. gets
se mantiene solo por compatibilidad con versiones anteriores con código anterior.
Esta pregunta ya tiene una respuesta aquí:
Cuando uso la función gets, gcc me da una advertencia:
warning:the `gets'' function is dangerous and should not be used.
¿Por qué se pone y pone en peligro la función?
Los desbordamientos del búfer son peligrosos. Aquí está la definición:
/* Get a line from the stdin stream. */
char *gets(char *buffer);
¿Qué tan grande es el buffer? Si un usuario escribe más datos que pueden caber en el búfer, el programa podría bloquearse y ser susceptible a ataques de hackers.
Obtiene no comprueba el desbordamiento del búfer exponiendo su código para atacar
Porque gets
no restringe la cantidad de datos que lee y, por lo tanto, es vulnerable a los desbordamientos del búfer. La respuesta de @Neil tiene la solución adecuada para esto.
La función de puts
no es peligrosa, AFAIK, a menos que, por supuesto, te olvides de terminarla nula.
gets
datos de lectura en el área de memoria dada hasta que se encuentre una nueva línea o un final de archivo. Si la entrada (por ejemplo, como la suministrada por el usuario) contiene una línea más larga que el tamaño del buffer suministrado a gets
, se desbordará y get escribirá en la memoria fuera del buffer. En el peor de los casos, esto puede permitir que un usuario malintencionado escriba datos que alteren el comportamiento del programa o incluso que ejecuten código arbitrario con los privilegios de ese programa (por ejemplo, uno que se ejecute en un servidor remoto o con los privilegios de otro usuario). e incluso los desbordamientos accidentales pueden romper el software.
fgets
su lugar, debe usar fgets
, ya que se necesita un argumento adicional para restringir el tamaño de la entrada.
Si tienes un código como este:
char s[10];
gets( s );
y escribe más de 10 caracteres cuando se ejecuta el programa, desbordará el búfer, causando un comportamiento indefinido. La función gets () no tiene medios para evitar que escriba los caracteres, por lo que debe evitarse. En su lugar, debe usar fgets (), que le permite limitar el número de caracteres leídos, para que el búfer no se desborde.
char s[10];
fgets( s, 10, stdin );
La función puts () es perfectamente segura, con la condición de que la cadena que está emitiendo sea terminada en nulo.