- C和C++安全編碼(原書(shū)第2版)
- (美)Robert C.Seacord
- 423字
- 2020-10-30 17:56:39
2.2.5 與函數(shù)無(wú)關(guān)的字符串錯(cuò)誤
大部分在標(biāo)準(zhǔn)字符串處理庫(kù)<string.h>中定義的函數(shù)都非常容易出錯(cuò),包括strcpy()、strcat()、strncpy()、strncat()和strtok()等。例如,微軟Visual Studio已經(jīng)廢棄了許多這樣的函數(shù)。盡管如此,由于空字符結(jié)尾的字符串是用字符數(shù)組實(shí)現(xiàn)的,因此,完全有可能在不調(diào)用任何函數(shù)的情況下做了不安全的字符串操作。下面的程序并沒(méi)有調(diào)用任何字符串庫(kù)函數(shù),然而卻包含了一個(gè)由字符串復(fù)制操作導(dǎo)致的缺陷。
01 int main(int argc, char *argv[]) { 02 int i = 0; 03 char buff[128]; 04 char *arg1 = argv[1]; 05 if (argc == 0) { 06 puts("No arguments"); 07 return EXIT_FAILURE; 08 } 10 while (arg1[i] != '\0') { 11 buff[i] = arg1[i]; 12 i++; 13 } 14 buff[i] = '\0'; 15 printf("buff = %s\n", buff); 16 exit(EXIT_SUCCESS); 17 }
這個(gè)有缺陷的程序接受一個(gè)字符串參數(shù),并將其復(fù)制到buff字符數(shù)組,然后打印buff中的內(nèi)容。變量buff被聲明為一個(gè)128個(gè)字符長(zhǎng)的定長(zhǎng)數(shù)組。如果提供給程序的第一個(gè)參數(shù)等于或者超過(guò)128個(gè)字符(請(qǐng)記住還有結(jié)尾的空字符),這個(gè)程序就會(huì)在數(shù)組的邊界外進(jìn)行寫(xiě)操作。
顯然,消除對(duì)危險(xiǎn)函數(shù)的使用并不能保證你的程序就能夠避免安全缺陷。在接下來(lái)的幾節(jié)中,你將會(huì)看到這些安全缺陷是如何導(dǎo)致可被利用的漏洞的。
推薦閱讀
- 精通Nginx(第2版)
- LabVIEW2018中文版 虛擬儀器程序設(shè)計(jì)自學(xué)手冊(cè)
- Power Up Your PowToon Studio Project
- 深入淺出Electron:原理、工程與實(shí)踐
- SQL學(xué)習(xí)指南(第3版)
- .NET 4.0面向?qū)ο缶幊搪劊夯A(chǔ)篇
- 數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)明教程(第2版)微課版
- Python自然語(yǔ)言處理(微課版)
- Mastering JBoss Enterprise Application Platform 7
- Java程序設(shè)計(jì)入門(mén)
- PySpark Cookbook
- D3.js By Example
- Python 3.7從入門(mén)到精通(視頻教學(xué)版)
- Exploring SE for Android
- Angular Design Patterns