所有外部資料 (使用者輸入、網路封包、檔案內容、環境變數) 都可能攜帶惡意負載。**輸入驗證** 是第一道防線,其次是**輸出編碼**、**最小權限**、**纂深度防禦**。
strcpy, sprintf, gets, memcpy 無長度檢查。strncpy_s, snprintf, memcpy_s (C11 Annex K) 或 strlcpy (BSD)。/GS (VC++), -fstack-protector-strong (GCC/Clang)。// 危險
void Bad(char* src, DWORD len) {
char dest[32];
memcpy(dest, src, len); // len 可能 > 32
}
// 安全
void Good(char* src, DWORD len) {
const size_t DEST_SZ = 32;
char dest[DEST_SZ];
memcpy(dest, src, min(len, DEST_SZ)); // 限制複製長度
dest[DEST_SZ-1] = '\0'; // 確保結尾
}
"SELECT * FROM Users WHERE Name='" + name + "'"。// ADO.NET 範例
cmd.CommandText = "SELECT * FROM Users WHERE Name=@Name";
cmd.Parameters.AddWithValue("@Name", userName);
<→<, >→>, "→", '→'。Content-Security-Policy 標頭限制腳本來源。bcrypt (cost 10+), Argon2id, PBKDF2 (100k+ 迭代)。bcrypt_checkpw(input, storedHash)。USER nonroot, cap_drop: ALL。Secure; HttpOnly; SameSite=Strict。customErrors=On, PHP display_errors=Off)。