функция warning:gets опасна [дубликат]

16
задан Marcelo Cantos 16 May 2010 в 08:39
поделиться

6 ответов

Если у вас есть код, подобный этому:

char s[10];
gets( s );

, и вы вводите более 10 символов при запуске программы, вы переполняете буфер, вызывая неопределенное поведение. Функция gets() не имеет возможности помешать вводу символов, и поэтому ее следует избегать. Вместо этого следует использовать fgets(), который позволяет ограничить количество читаемых символов, чтобы буфер не переполнялся.:

char s[10];
fgets( s, 10, stdin );

Функция puts() совершенно безопасна, при условии, выводимая строка имеет нулевое окончание.

48
ответ дан 30 November 2019 в 15:21
поделиться

Переполнение буфера опасно. Вот определение:

/* Get a line from the stdin stream. */
char *gets(char *buffer);

Насколько велик буфер? Если пользователь вводит больше данных, которые могут поместиться в буфере, программа может аварийно завершить работу и стать уязвимой для хакерских атак.

3
ответ дан 30 November 2019 в 15:21
поделиться

получает считывает данные в заданную область памяти до новой строки или конца файла встречается. Если входные данные (например, предоставленные пользователем) содержат строку длиннее, чем размер буфера, предоставленного для gets , он переполняется и получает запись в память вне буфера. В худшем случае это может позволить злоумышленнику записывать данные, которые изменяют поведение программы или, возможно, даже выполнять произвольный код с привилегиями этой программы (например, тот, который может быть запущен на удаленном сервере или с привилегиями другого пользователя), и даже случайное переполнение может привести к поломке программного обеспечения. Вместо этого следует использовать

fgets , поскольку для ограничения размера ввода требуется дополнительный аргумент.

1
ответ дан 30 November 2019 в 15:21
поделиться

Поскольку получает, не ограничивает объем данных, которые он читает, и, таким образом, уязвим для переполнения буфера. Ответ @Nil имеет подходящее решение для этого.

Функция put не опасна, AFAIK, если, конечно, вы не забыли завершить ее нулем.

4
ответ дан 30 November 2019 в 15:21
поделиться

Gets не проверяет переполнение буфера, что делает ваш код уязвимым для атаки

1
ответ дан 30 November 2019 в 15:21
поделиться

Как говорится в статье Википедии, gets() по своей сути небезопасно, потому что все, что нужно, это char * в качестве аргумента.

Это опасно, потому что метод не может узнать, сколько места было выделено для этого char * в любой ситуации. Поэтому gets ведет себя так, как будто у него есть пустой чек, чтобы записать в него как можно больше данных,что может привести к переполнению буфера.

Альтернативой является fgets, который принимает не только массив символов, но и максимальную длину и указатель потока. gets хранится только для обратной совместимости со старым кодом.

2
ответ дан 30 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: