Michael Howard 與 Keith Brown (Microsoft 資安團隊) 提煉出十大實務守則,涵蓋輸入驗證、記憶體安全、加密、最小權限、錯誤處理、模擬風險、非管理員執行等核心面向。遵循這些原則可大幅降低應用程式被攻擊風險。
核心:所有外部資料 (表單、QueryString、Cookie、HTTP 標頭、檔案、資料庫、IPC、註冊表) 皆視為惡意,直到經過嚴格驗證。信任輸入導致緩衝區溢位、XSS、SQL Injection、命令注入、路徑遍歷等漏洞。
strcpy_s, strcat_s, sprintf_s, StringCchCopy, StringCchPrintf) 取代 strcpy/sprintf/gets。memcpy(dest, src, min(destSize, srcLen))。/GS (Stack Cookie)、/DYNAMICBASE (ASLR)、/NXCOMPAT (DEP)、/guard:cf (Control Flow Guard)。std::string, std::vector) 避免手動緩衝區管理。
// 危險
void Bad(char* src, DWORD len) { char buf[32]; memcpy(buf, src, len); }
// 安全
void Good(char* src, DWORD len) {
const size_t DEST_SIZE = 32;
char buf[DEST_SIZE];
memcpy(buf, src, min(DEST_SIZE, len)); // 截斷而非溢位
buf[DEST_SIZE-1] = '\0'; // 確保結尾
}
^[\w]{1,40}$),拒絕清單不可靠。HttpUtility.HtmlEncode, JavaScriptStringEncode;ASP: Server.HTMLEncode;Razor 自動編碼。HttpOnly、Secure、SameSite Cookie 旗標。cmd.Parameters.Add("@Id", id)。
// 危險:'1001' DROP TABLE shipping --
sql = "SELECT * FROM shipping WHERE id = '" + id + "'";
// 安全:參數化
cmd.CommandText = "SELECT * FROM shipping WHERE id = @Id";
cmd.Parameters.Add("@Id", id);
System.Security.Cryptography (AES, RSA, ECDSA, SHA-256, HMAC, PBKDF2, HKDF)。PermissionSet、Deny/PermitOnly 限制插件權限。new PermissionSet(PermissionState.None).AddPermission(...).PermitOnly() 限制權限。bool access = false; try { ... access = true; } catch(...) { /* 保持 false */ }。using / try/finally 確保資源釋放。
// 危險:樂觀預設
bool ok = true;
try { File.Open(...); } catch(SecurityException) { ok = false; } catch(...) { /* ok 仍為 true! */ }
// 安全:悲觀預設
bool ok = false;
try { File.Open(...); ok = true; } catch(...) { /* ok 保持 false */ }
ImpersonateLoggedOnUser, RevertToSelf, ASP.NET <identity impersonate="true">) 讓執行緒以呼叫者身分存取資源,方便但風險高:RevertToSelf 取得進程權限 (常為 SYSTEM)。AccessCheck)、以服務帳號統一存取資源、若必須模擬則嚴格限制範圍並及時 RevertToSelf。%LOCALAPPDATA%、%APPDATA%、%TEMP%,不可寫入 Program Files、Windows、System32、HKLM。runas、ShellExecuteEx(..., "runas"))。| # | 守則 | 關鍵行動 |
|---|---|---|
| 1 | 不信任輸入 | 白名單驗證、輸出編碼、參數化查詢 |
| 2 | 防緩衝區溢位 | 安全函式、/GS、ASLR、DEP、標準容器 |
| 3 | 防 XSS | HtmlEncode、CSP、HttpOnly Cookie |
| 4 | 防 SQL Injection | 參數化、最小權限帳號、隱藏錯誤 |
| 5 | 不用自製加密 | CNG/CAPI/OpenSSL/libsodium、金鑰保管庫 |
| 6 | 減少攻擊面 | 最小安裝、最低權限服務、關閉未用埠 |
| 7 | 最小權限 | 隔離高權限進程、CAS/PermitOnly 限制插件 |
| 8 | 失敗安全 | 悲觀預設、RAII、不洩漏錯誤細節 |
| 9 | 慎用模擬 | 避免模擬、改用 AccessCheck、及時 RevertToSelf |
| 10 | 非管理員執行 | 標準用戶開發、資料寫用戶目錄、安裝程式分離 |