簡體   English   中英

C ++中的堆棧溢出校正

[英]Stack overflow correction in C++

我讀了一本書中的以下代碼,該代碼很容易出現堆棧溢出。 盡管使用了fgets(),但我還是聽不懂,為什么它容易受到攻擊?

我的理解是,使用fgets()代替gets()通常可以通過在最后放置一個null來幫助我們擺脫緩沖區溢出。 我想念什么嗎? 應該使用什么代替fgets()來糾正堆棧溢出?

void getinp(char *inp, int siz)
{
   puts("Input value: ");
   fgets(inp, siz, stdin);
   printf("buffer3 getinp read %s\n", inp);
}

void display(char * val)
{
   char tmp[16];
   sprintf(tmp, "read val: %s\n", val);
   puts(tmp);
}

int main(int argc, char *argv[])
{
   char buf[16];
   getinp(buf, sizeof(buf));
   display(buf);
   printf("buffer3 done\n");
}

display tmp聲明為16個char長,但是您正在寫(使用sprintf )不僅有val (保證為16個字符或更少),而且還有"read val: "和最后的\\n

這意味着,如果用戶插入的字符超過16-11 = 5個字符,則display會出現緩沖區溢出。

一種解決方案可能是聲明display buf足夠大,可以存儲val和其他文本,盡管在現實世界中,您只需要使用printfstdout寫入即可(無需中間緩沖區)。

另外,通常,當您有sprintf且存在緩沖區溢出的潛在風險時,請改用snprintf (實際上,我始終使用); snprintf不會溢出緩沖區,而是將其截斷(如果輸出的長度太長),並返回如果輸出緩沖區足夠大的情況下應寫入的字符數。

在顯示中,無法確定val + 12個字節是否適合16個字符的緩沖區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM