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

2.3.1 被污染的數據

例2.3是一個簡單的程序,它檢查用戶密碼(應考慮被污染的數據),并授權或拒絕訪問。

例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  }

該程序僅僅是用來演示字符串是如何被誤用的,并非密碼檢查之范本程序。這個IsPasswordOK()程序從main()函數開始執行。執行的第一行代碼是調用puts()打印出一段字符串字面值。在C標準中,puts()函數被定義為字符輸出函數,它在<stdio.h>中聲明,其功能是在由stdout所指向的輸出流中寫入一個字符串并且以換行符('\n')結尾。IsPasswordOK()函數緊接著被調用,從用戶那里獲取一個密碼。該函數返回一個布爾值,如果密碼有效將返回true,如果無效則返回false。后面的程序檢測PwStatus的值,以決定是否給用戶授權或者拒絕用戶訪問。

IsPasswordOK()函數使用gets()函數從(stdin所指向的)輸入流中讀取字符,存儲到由Password所指向的數組中,直到遇見文件結束(end-of-file,EOF)標志或者換行符。任何換行符都將被丟棄,并且當最后一個字符被讀入數組后,立即會加上一個用作結尾的空字符。<string.h>頭文件中定義的strcmp()函數將由Password所指向的字符串和字符串字面量“goodpass”作比較,如果兩者相同,它將返回一個值為0的整數,如果兩者不同,則返回值不為0。IsPasswordOK()函數在用戶輸入的密碼等于“goodpass”時返回true,main()函數以此為依據決定是否授權用戶訪問。

在程序第一次運行中(參見圖2.2),用戶輸入正確的密碼,因此被授權訪問。

第二次運行中(參見圖2.3),用戶輸入的密碼不正確,因此系統拒絕用戶的訪問。

遺憾的是,該程序包含一個安全缺陷,該缺陷允許攻擊者繞過密碼保護邏輯,直接獲得對程序的訪問權限。你能識別出這個缺陷嗎?

圖2.2 用戶輸入正確的密碼,因此被授權訪問

圖2.3 用戶輸入的密碼不正確,因此被拒絕訪問

主站蜘蛛池模板: 贵溪市| 正蓝旗| 栾川县| 西充县| 陆河县| 平乡县| 无极县| 客服| 西乌| 天津市| 凤城市| 苏尼特左旗| 乃东县| 红安县| 阿鲁科尔沁旗| 海晏县| 枣阳市| 曲沃县| 施秉县| 曲阳县| 武强县| 襄樊市| 安多县| 锡林郭勒盟| 灵山县| 山东| 会昌县| 夏河县| 兴隆县| 安丘市| 东乌| 琼中| 友谊县| 金华市| 郓城县| 海林市| 抚宁县| 兰州市| 元氏县| 扶风县| 平果县|