- C和C++安全編碼(原書第2版)
- (美)Robert C.Seacord
- 715字
- 2020-10-30 17:56:39
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 用戶輸入的密碼不正確,因此被拒絕訪問
- R語言經典實例(原書第2版)
- Moodle Administration Essentials
- Practical Data Science Cookbook(Second Edition)
- Mastering C# Concurrency
- 飛槳PaddlePaddle深度學習實戰
- HTML5與CSS3基礎教程(第8版)
- Yii Project Blueprints
- Python機器學習之金融風險管理
- Arduino Wearable Projects
- Microsoft HoloLens By Example
- jQuery Mobile Web Development Essentials(Second Edition)
- 例說FPGA:可直接用于工程項目的第一手經驗
- Java語言程序設計實用教程(第2版)
- C語言編程魔法書:基于C11標準
- C# 10核心技術指南