- C和C++安全編碼(原書(shū)第2版)
- (美)Robert C.Seacord
- 715字
- 2020-10-30 17:56:39
2.3.1 被污染的數(shù)據(jù)
例2.3是一個(gè)簡(jiǎn)單的程序,它檢查用戶(hù)密碼(應(yīng)考慮被污染的數(shù)據(jù)),并授權(quán)或拒絕訪問(wèn)。
例2.3 IsPasswordOK()程序
01 bool IsPasswordOK(void) { 02 char Password[12]; 03 04 gets(Password); 05 r eturn 0 == strcmp(Password, "goodpass"); 06 } 07 08 int main(void) { 09 bool PwStatus; 10 11 puts("Enter password:"); 12 PwStatus = IsPasswordOK(); 13 if (PwStatus == false) { 14 puts("Access denied"); 15 exit(-1); 16 } 17 }
該程序僅僅是用來(lái)演示字符串是如何被誤用的,并非密碼檢查之范本程序。這個(gè)IsPasswordOK()程序從main()函數(shù)開(kāi)始執(zhí)行。執(zhí)行的第一行代碼是調(diào)用puts()打印出一段字符串字面值。在C標(biāo)準(zhǔn)中,puts()函數(shù)被定義為字符輸出函數(shù),它在<stdio.h>中聲明,其功能是在由stdout所指向的輸出流中寫(xiě)入一個(gè)字符串并且以換行符('\n')結(jié)尾。IsPasswordOK()函數(shù)緊接著被調(diào)用,從用戶(hù)那里獲取一個(gè)密碼。該函數(shù)返回一個(gè)布爾值,如果密碼有效將返回true,如果無(wú)效則返回false。后面的程序檢測(cè)PwStatus的值,以決定是否給用戶(hù)授權(quán)或者拒絕用戶(hù)訪問(wèn)。
IsPasswordOK()函數(shù)使用gets()函數(shù)從(stdin所指向的)輸入流中讀取字符,存儲(chǔ)到由Password所指向的數(shù)組中,直到遇見(jiàn)文件結(jié)束(end-of-file,EOF)標(biāo)志或者換行符。任何換行符都將被丟棄,并且當(dāng)最后一個(gè)字符被讀入數(shù)組后,立即會(huì)加上一個(gè)用作結(jié)尾的空字符。<string.h>頭文件中定義的strcmp()函數(shù)將由Password所指向的字符串和字符串字面量“goodpass”作比較,如果兩者相同,它將返回一個(gè)值為0的整數(shù),如果兩者不同,則返回值不為0。IsPasswordOK()函數(shù)在用戶(hù)輸入的密碼等于“goodpass”時(shí)返回true,main()函數(shù)以此為依據(jù)決定是否授權(quán)用戶(hù)訪問(wèn)。
在程序第一次運(yùn)行中(參見(jiàn)圖2.2),用戶(hù)輸入正確的密碼,因此被授權(quán)訪問(wèn)。
第二次運(yùn)行中(參見(jiàn)圖2.3),用戶(hù)輸入的密碼不正確,因此系統(tǒng)拒絕用戶(hù)的訪問(wèn)。
遺憾的是,該程序包含一個(gè)安全缺陷,該缺陷允許攻擊者繞過(guò)密碼保護(hù)邏輯,直接獲得對(duì)程序的訪問(wèn)權(quán)限。你能識(shí)別出這個(gè)缺陷嗎?
圖2.2 用戶(hù)輸入正確的密碼,因此被授權(quán)訪問(wèn)
圖2.3 用戶(hù)輸入的密碼不正確,因此被拒絕訪問(wèn)
- Learning Java Functional Programming
- Visual Basic 6.0程序設(shè)計(jì)計(jì)算機(jī)組裝與維修
- Getting Started with ResearchKit
- vSphere High Performance Cookbook
- Flink SQL與DataStream入門(mén)、進(jìn)階與實(shí)戰(zhàn)
- 精通軟件性能測(cè)試與LoadRunner實(shí)戰(zhàn)(第2版)
- Python算法詳解
- SQL 經(jīng)典實(shí)例
- 后臺(tái)開(kāi)發(fā):核心技術(shù)與應(yīng)用實(shí)踐
- Web App Testing Using Knockout.JS
- SpringBoot從零開(kāi)始學(xué)(視頻教學(xué)版)
- Learning Bootstrap 4(Second Edition)
- Getting Started with React VR
- R語(yǔ)言數(shù)據(jù)挖掘:實(shí)用項(xiàng)目解析
- Android編程權(quán)威指南(第4版)