緩沖區(qū)溢出
??如果用戶輸入的數(shù)據(jù)長(zhǎng)度超出了程序?yàn)槠浞峙涞膬?nèi)存空間,這些數(shù)據(jù)就會(huì)覆蓋程序?yàn)槠渌鼣?shù)據(jù)分配的內(nèi)存空間,形成所謂的緩沖區(qū)溢出。所謂的棧溢出、堆溢出等都屬于典型的緩沖區(qū)溢出。
??下面借助一個(gè)棧溢出的例子更好地去理解緩沖區(qū)溢出。
??
在 C 語(yǔ)言中,一個(gè)字符通常占用 1 個(gè)字節(jié)的內(nèi)存空間。因此,當(dāng)你輸入一個(gè)包含 8 個(gè)字符的字符串 "aaaaaaaa" 時(shí),它實(shí)際上占用了 8 個(gè)字節(jié)的內(nèi)存空間。
這是因?yàn)?C 語(yǔ)言中的字符串是以 null 終止符 '\0' 結(jié)尾的。也就是說(shuō),一個(gè) 8 個(gè)字符的字符串實(shí)際上由 8 個(gè)字符 + 1 個(gè) null 終止符組成,總共占用 9 個(gè)字節(jié)的內(nèi)存空間。
所以,當(dāng)用戶輸入 "aaaaaaaa" 時(shí),這個(gè)字符串的長(zhǎng)度為 8 個(gè)字符,但它實(shí)際上占用了 9 個(gè)字節(jié)的內(nèi)存空間。
這就是為什么在 verify_password() 函數(shù)中,使用 8 字節(jié)大小的 buffer 數(shù)組無(wú)法完全容納 8 個(gè)字符加 1 個(gè) null 終止符的字符串。這就會(huì)導(dǎo)致緩沖區(qū)溢出的問(wèn)題。
總之,在處理字符串時(shí),需要注意字符長(zhǎng)度和字節(jié)長(zhǎng)度的區(qū)別,以免出現(xiàn)安全隱患。
??

浙公網(wǎng)安備 33010602011771號(hào)