C語(yǔ)言使用直接的內(nèi)存訪問(wèn),緩沖區(qū)溢出是經(jīng)常出現(xiàn)的安全問(wèn)題。
下面將介紹常見(jiàn)的緩沖區(qū)溢出,及防止方法。
1、判斷邊界
例程序:
void outstr(int a[10])
{
for(i=0;a[i]!=0&&i<10;i++)
{
printf("%d\n",a[i]);
}
}
當(dāng)i=10時(shí),判斷i<10同時(shí)需要判斷a[i]!=0,
此時(shí)a[10]已經(jīng)訪問(wèn)到非法區(qū)域,可能引起緩沖區(qū)溢出問(wèn)題。
防止方法:將判斷條件分成幾條語(yǔ)句
例:
if(i<10){
if(a[i]!=0){
...
}
}
2、字符串操作
C語(yǔ)言的字符串庫(kù)沒(méi)有安全保護(hù),在使用時(shí)要特別小心。
strcpy、strcat等函數(shù)操作時(shí)沒(méi)有檢查緩沖區(qū)大小,容易引起安全問(wèn)題。
防止方法:
1)使用strncpy、strncat,限制拷貝字符串長(zhǎng)度。
2)或者是在strcpy、strcat之前檢查緩沖區(qū)大小是否滿足要求。
3、free
free后指針不是NULL。所以判斷指針是否為NULL并不能保證指針有效。
防止方法:在free后重置指針。
free(p);p=NULL;
4、指針未初始化
指針未初始化便引用。指針初始值未知,無(wú)法根據(jù)值判定指針是否有效。
指針聲明后盡快初始化,如不能初始化為有效值,也要初始化為NULL。
防止方法:每次使用指針,不能確定指針有效時(shí),先判斷指針是否為NULL。