Как уменьшить уязвимость strcat и strcmp?
Я знаю, что зал семьи strcpy
, strcat
а также strcmp
иметь уязвимость переполнения буфера, чтобы смягчить strcpy
Уязвимость кто-то может использовать strlcpy
, что насчет strcat
а также strcmp
Есть ли безопасные версии этих функций или кто-то должен проверить переменные вручную?
1 ответ
Я рекомендую о семействе str-n-func:
Используйте strncpy вместо strcpy, strncat вместо strcat, strncmp вместо strcmp и так далее.
Дополнительный n предназначен для дополнительного (третьего) параметра, то есть как максимальное количество символов для копирования / объединения / сравнения.
Читайте о них здесь (с примерами):
http://www.cplusplus.com/reference/cstring/strncmp/
http://www.cplusplus.com/reference/cstring/strncat/
Замечания:
- Функции strlcpy и strlcat не являются стандартными.
- Вы должны быть осторожны, так как (например) копирование не более n символов из строки, содержащей более n символов (до первого нуля), будет заканчиваться строкой, не заканчивающейся нулем.
- Обычно, как программист, у вас есть возможность узнать, какова длина строк, с которыми вы имеете дело, и потому что предыдущее замечание, даже если вы используете str-n-функции, вам все равно нужно это знать.
Проблема главным образом в чтении ввода в некоторый конечный буфер. Вы не должны использовать scanf или gets, и вы можете использовать fgets. Например: вместо использования get для чтения строки из стандартного ввода используйте fgets следующим образом:
fgets (str, sizeof (str), stdin);