[英]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
和其他文本,盡管在現實世界中,您只需要使用printf
向stdout
寫入即可(無需中間緩沖區)。
另外,通常,當您有sprintf
且存在緩沖區溢出的潛在風險時,請改用snprintf
(實際上,我始終使用); snprintf
不會溢出緩沖區,而是將其截斷(如果輸出的長度太長),並返回如果輸出緩沖區足夠大的情況下應寫入的字符數。
在顯示中,無法確定val + 12個字節是否適合16個字符的緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.