Если у вас есть код, подобный этому:
char s[10];
gets( s );
, и вы вводите более 10 символов при запуске программы, вы переполняете буфер, вызывая неопределенное поведение. Функция gets() не имеет возможности помешать вводу символов, и поэтому ее следует избегать. Вместо этого следует использовать fgets(), который позволяет ограничить количество читаемых символов, чтобы буфер не переполнялся.:
char s[10];
fgets( s, 10, stdin );
Функция puts() совершенно безопасна, при условии, выводимая строка имеет нулевое окончание.
Переполнение буфера опасно. Вот определение:
/* Get a line from the stdin stream. */
char *gets(char *buffer);
Насколько велик буфер? Если пользователь вводит больше данных, которые могут поместиться в буфере, программа может аварийно завершить работу и стать уязвимой для хакерских атак.
получает
считывает данные в заданную область памяти до новой строки или конца файла встречается. Если входные данные (например, предоставленные пользователем) содержат строку длиннее, чем размер буфера, предоставленного для gets
, он переполняется и получает запись в память вне буфера. В худшем случае это может позволить злоумышленнику записывать данные, которые изменяют поведение программы или, возможно, даже выполнять произвольный код с привилегиями этой программы (например, тот, который может быть запущен на удаленном сервере или с привилегиями другого пользователя), и даже случайное переполнение может привести к поломке программного обеспечения. Вместо этого следует использовать
fgets
, поскольку для ограничения размера ввода требуется дополнительный аргумент.
Поскольку получает,
не ограничивает объем данных, которые он читает, и, таким образом, уязвим для переполнения буфера. Ответ @Nil имеет подходящее решение для этого.
Функция put
не опасна, AFAIK, если, конечно, вы не забыли завершить ее нулем.
Gets не проверяет переполнение буфера, что делает ваш код уязвимым для атаки
Как говорится в статье Википедии, gets()
по своей сути небезопасно, потому что все, что нужно, это char *
в качестве аргумента.
Это опасно, потому что метод не может узнать, сколько места было выделено для этого char *
в любой ситуации. Поэтому gets
ведет себя так, как будто у него есть пустой чек, чтобы записать в него как можно больше данных,что может привести к переполнению буфера.
Альтернативой является fgets
, который принимает не только массив символов, но и максимальную длину и указатель потока. gets
хранится только для обратной совместимости со старым кодом.