缓冲区溢出
如果用户输入的数据长度超出了程序为其分配的内存空间,这些数据就会覆盖程序为其它数据分配的内存空间,形成所谓的缓冲区溢出。所谓的栈溢出、堆溢出等都属于典型的缓冲区溢出。
下面借助一个栈溢出的例子更好地去理解缓冲区溢出。
在 C 语言中,一个字符通常占用 1 个字节的内存空间。因此,当你输入一个包含 8 个字符的字符串 "aaaaaaaa" 时,它实际上占用了 8 个字节的内存空间。
这是因为 C 语言中的字符串是以 null 终止符 '\0' 结尾的。也就是说,一个 8 个字符的字符串实际上由 8 个字符 + 1 个 null 终止符组成,总共占用 9 个字节的内存空间。
所以,当用户输入 "aaaaaaaa" 时,这个字符串的长度为 8 个字符,但它实际上占用了 9 个字节的内存空间。
这就是为什么在 verify_password() 函数中,使用 8 字节大小的 buffer 数组无法完全容纳 8 个字符加 1 个 null 终止符的字符串。这就会导致缓冲区溢出的问题。
总之,在处理字符串时,需要注意字符长度和字节长度的区别,以免出现安全隐患。

浙公网安备 33010602011771号