如果我错了,请纠正我,我在网站上进行了研究,但找不到针对此问题的任何综合帖子。 C 中有许多不安全函数可能导致缓冲区溢出,并且有安全函数来替代它们。我有几个:
-
gets()
=== 替换为===fgets()
-
sprintf()
=== 替换为 === ?
-
strcat()
=== 替换为 === ?
-
strcpy()
=== 替换为===strncpy()
-
vsprintf()
=== 替换为===vsnprintf()
另外,我坚持使用下面的不安全字节复制和不安全字节输入代码。我该如何解决这些问题?
为什么这段代码存在漏洞?
int copy_buf (char *to, int pos, char *from, int len)
{
int i;
for (i=0;i<len;<i++){
to[pos] = from [i];
pos++;
}
return pos
}
对于字节输入,是fread()
不安全功能?为什么这里会发生缓冲区溢出呢?
short read_chunk(FILE fil, char *to)
{
short len;
fread(&len, 2, 1, fil);
fread(to, 1, len, fil);
return len;
}
以下是一些不安全的 C 函数及其替换的新函数的列表
- strcpy -> strncpy -> strlcpy/strcpy_s
- strcat -> strncat -> strlcat/strcat_s
-strtok
- sprintf -> snprintf
- vsprintf -> vsnprintf
- 获取 -> fgets/gets_s
- makepath -> _makepath_s (MSDN)
- _splitpath -> _splitpath_s (MSDN)
- scanf/sscanf -> sscanf_s (MSDN)
- snscanf -> _snscanf_s (MSDN)
- strlen -> strnlen_s (MSDN)
某些函数无论如何使用都会以危险的方式运行。此类功能的实现通常没有考虑安全问题。 gets() 函数不安全,因为它不会对其输入的大小执行边界检查。
攻击者可以轻松地将任意大小的输入发送到 gets() 并溢出目标缓冲区。同样,在读入静态分配的字符数组时使用 >> 运算符也是不安全的,因为它不会对其输入的大小执行边界检查。攻击者可以轻松地将任意大小的输入发送到 >> 运算符并溢出目标缓冲区。
下面的代码调用 gets() 将信息读入缓冲区。
char buf[24];
printf("Please enter your name and press <Enter>\n");
gets(buf);
...
}
然而,程序员使用的函数 gets() 本质上是不安全的,因为它盲目地将所有输入从 STDIN 复制到缓冲区而不检查大小。这允许用户提供大于缓冲区大小的字符串,从而导致溢出情况
您可以在此处进一步阅读有关 C/C++ 中的危险的更多信息。
http://www.dwheeler.com/secure-class/Secure-Programs-HOWTO/dangers-c.html http://www.dwheeler.com/secure-class/Secure-Programs-HOWTO/dangers-c.html
- http://www.dwheeler.com/secure-programs/ http://www.dwheeler.com/secure-programs/
- http://courses.cs.washington.edu/courses/cse341/04wi/lectures/26-unsafe-languages.html http://courses.cs.washington.edu/courses/cse341/04wi/lectures/26-unsafe-languages.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)