官术网_书友最值得收藏!

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)

主站蜘蛛池模板: 峡江县| 桓仁| 安塞县| 沾益县| 清徐县| 淄博市| 深圳市| 云阳县| 抚顺县| 通河县| 鄂托克旗| 宝应县| 南汇区| 丰宁| 毕节市| 五莲县| 乌什县| 涪陵区| 济宁市| 荆门市| 呼和浩特市| 临朐县| 崇左市| 蓬安县| 龙岩市| 威远县| 铁岭县| 土默特右旗| 彭水| 通许县| 黄龙县| 长沙县| 海宁市| 崇礼县| 平塘县| 鄂托克前旗| 南城县| 元阳县| 文安县| 红安县| 大城县|