据说这个代码片段在软件安全性方面存在错误,我似乎无法弄明白......函数die在显示字符串参数后终止程序。
void get_user(char* user)
{
char buf[1024];
if (strlen(user) > sizeof(buf))
die("error: user string too long\n");
strcpy(buf, user);
…
}
-thx!
答案 0 :(得分:4)
它不计算字符串的NUL(\0
)终止符。
if (strlen(user) >= sizeof(buf))
user
有1024个字符(在堆栈的某处写0
)是不安全的。
答案 1 :(得分:4)
如果strlen(user)
等于1024,strcpy
将在buf
的末尾写一个字节。
答案 2 :(得分:3)
问题在于:
if (strlen(user) > sizeof(buf))
这不考虑strlen(user) == sizeof( buf )
时的空终止符。检查应
if (strlen(user) > sizeof(buf) - 1 )
以便strcpy()
可以随时复制空终止符。
答案 3 :(得分:2)
有一个可能导致缓冲区溢出的off-by-one错误。请记住,strlen为您提供字符串中的字符数,排除空终止符。检查应该是:
if (strlen(user) + 1 > sizeof(buf))
答案 4 :(得分:1)
答案 5 :(得分:1)
来自strlen联机帮助页:
strlen()函数计算字符串s的长度,而不是 包括终止'\ 0'字符。
并从strcpy手册页中获取:
strcpy()函数复制src指向的字符串,包括 终止空字节('\ 0'),指向dest。
指向的缓冲区
尺寸比较不匹配。代码检查字符串长度是否小于缓冲区,但复制字符串长度为+1个字符。如果字符串长度(减去终止'\ 0')为1024,则发生溢出。