歡迎來到健壯與安全程式設計的世界!
各位未來的電腦科學家,你們好!別擔心「健壯」(Robust)與「安全」(Secure)這些詞聽起來很深奧——它們不過是指要確保你的程式足夠堅固、可靠,且不會被突發狀況或有心人士惡意破壞。這是程式設計中最關鍵的章節之一,因為如果一個程式容易崩潰或允許未授權人員存取數據,那它就毫無用處(甚至可能帶來危險!)。
本章將學習如何編寫能夠處理錯誤、處理無效數據,並抵禦系統濫用的程式碼。
第一節:什麼是健壯程式設計?
健壯性的目標
所謂的健壯程式(Robust Program),是指即使在發生預料之外的情況時,也不會崩潰的程式。它非常強韌!
試想一下,你要求使用者輸入年齡。如果他們不小心輸入了英文單詞 "twenty-five" 而不是數字 "25",會發生什麼事?一個健壯的程式會偵測到這個錯誤,禮貌地要求使用者修正,然後繼續執行。而不夠健壯的程式可能會直接停止運作(崩潰)。
為什麼程式會變得不可靠?
- 無效數據(Bad Data): 最常見的原因!使用者輸入了不正確類型的數據(例如在需要數字的地方輸入了文字)。
- 突發狀況(Unexpected Situations): 檔案被誤刪、網路斷線,或程式記憶體耗盡。
- 駭客入侵(Hacker Attempts): 有人蓄意破壞程式以取得資料權限。
重點總結: 健壯性意味著你的程式是可靠的,並且能優雅地處理錯誤,而不是直接崩潰。
第二節:提升程式碼健壯性——輸入驗證
什麼是輸入驗證?
輸入驗證(Input Validation)是指在程式使用資料之前,對使用者輸入(或來自其他來源)的資料進行檢查,確保其合理、完整且格式正確的過程。
比喻:將輸入驗證想像成夜店門口的保安。保安(驗證)會檢查每個人(輸入資料),確認他們符合規定(年齡是否足夠、身份證明格式是否正確),才讓他們進入夜店(主程式)。
如果資料未通過驗證,程式應顯示清晰的錯誤訊息,並要求使用者重新輸入。
驗證檢查的類型 (R-T-L-P-F)
程式設計師會使用幾種標準檢查方式。了解這些類型對考試至關重要!
1. 範圍檢查 (Range Check)
檢查資料是否落在最小值與最大值的限制範圍內。
- 例子: 如果要詢問每週工作時數,你可以設定範圍為 1 到 168(因為一週有 168 小時)。超出此範圍的任何數字都應被拒絕。
2. 類型檢查 (Type Check)
檢查資料是否為正確的資料類型(例如:整數、字串、布林值)。
- 例子: 如果你需要使用者的年齡(必須是數字/整數),程式會檢查輸入是否僅包含數字。如果使用者輸入 "one",它就會無法通過類型檢查。
3. 長度檢查 (Length Check)
檢查資料是否具有規定的字元數。這通常涉及設定最小長度、最大長度或固定長度。
- 例子: 密碼可能要求最少 8 個字元。英國電話號碼可能要求剛好 11 位數字。
4. 存在性檢查 (Presence Check)
檢查欄位中是否已輸入資料。輸入框是否留空了?
- 例子: 如果使用者嘗試提交線上表單,存在性檢查能確保必填欄位(如「使用者名稱」或「電子郵件」)沒有留空。
5. 格式檢查 (Format Check)
檢查資料是否符合特定的預定義模式。這通常用於代碼或 ID。
- 例子: 英國郵遞區號應具有特定的字母與數字組合(例如 SW1A 0AA)。電子郵件地址必須包含 "@" 符號與 "."。
快速複習:驗證記憶法
使用記憶術 R-T-L-P-F 來記住這五大檢查:
- Range (範圍)
- Type (類型)
- Length (長度)
- Presence (存在性)
- Format (格式)
重點總結: 驗證確保了資料品質。健壯的程式必須驗證所有輸入,以防止系統因無效資料而崩潰。
第三節:安全程式設計——驗證與存取控制
程式設計中的安全性(Security)著重於保護程式及其處理的資料,防止未授權的存取或惡意破壞。
什麼是身分驗證?
身分驗證(Authentication)是確認使用者是否為其所聲稱之人的過程。這通常是任何系統的第一道防線。
比喻:這就像在機場出示護照。你必須證明你的身分,才能被允許繼續前進。
使用者名稱與密碼系統
最常見的身分驗證方式依賴於使用者提供他們知道的資訊(密碼),有時還包括他們擁有的東西(使用者名稱/ID)。
你知道嗎? 程式設計師絕不能以明文(plain text)儲存密碼!如果駭客竊取了資料庫,他們就能瞬間取得所有人的密碼。
相反地,密碼應該經過雜湊處理(Hashing)。雜湊是一種單向數學函數,能將密碼(例如 "MyCat123")轉換成一段很長、毫無意義的代碼(例如 "d34f0c4a...")。即使駭客竊取了這些亂碼,也無法輕易將其反向還原出原始密碼。
雙重驗證 (Two-Factor Authentication, 2FA)
對於高安全性系統,基本的「使用者名稱+密碼」是不夠的,這就是雙重驗證(2FA)發揮作用的地方。
2FA 要求使用者在獲准存取前提供兩種不同類型的驗證方式,使系統更加安全。
這兩項要素通常來自以下三個類別:
- 你知道的: 密碼或 PIN 碼。
- 你擁有的: 手機(接收簡訊代碼)、安全金鑰或存取卡。
- 你的特徵: 生物辨識,如指紋或臉部辨識。
例子:當你登入銀行帳戶時,你輸入密碼(要素 1:你知道的),然後銀行會傳送臨時代碼到你的手機(要素 2:你擁有的)。
重點總結: 身分驗證用以確認身分。現代系統使用密碼雜湊與 2FA 來達到最高安全性,要求兩種獨立的證明方式。
第四節:維護性與健壯性的優秀程式設計習慣
健壯性不僅僅是處理使用者錯誤,還包括讓程式碼在日後易於修正與更新。這稱為維護性(Maintenance)。
清晰、可讀的程式碼
程式設計師必須寫出易於讓他人(或未來的自己!)理解的程式碼。這能提升健壯性,因為它能讓偵錯與修正錯誤變得更快。
1. 使用有意義的識別碼名稱
變數名稱應能清楚解釋其內容物。
- 不良範例:
i = 0
d = i + 10 - 優良範例:
numberOfItems = 0
totalCost = numberOfItems + priceOfDelivery
2. 使用內部註解 (Comments)
註解(Comments)是直接寫在程式碼中,供電腦忽略的筆記。它們解釋了程式碼的功能以及目的。
添加註解對維護至關重要。如果複雜的程式碼區段發生錯誤,清楚的註解能幫助維護團隊立刻理解原始設計者的意圖。
Python 風格的註解範例:
# 此迴圈用以計算銷售總額。
for sale in salesList:
runningTotal = runningTotal + sale
避免常見的安全錯誤
安全程式設計需要時時刻刻保持警覺。一個關鍵領域是管理存取權限。
- 避免硬編碼秘密(Hardcoding Secrets): 切勿將密碼、安全金鑰或敏感資訊直接寫入程式碼中。
- 最小權限原則(Principle of Least Privilege): 使用者(或程式組件)應僅擁有完成工作所需的最小存取權限。例如,網站訪客不應該擁有刪除資料庫的權限。
重點總結: 良好的程式設計習慣(如具意義的名稱與詳細註解)能讓程式碼易於維護,這對於長期的健壯性與安全性至關重要。
總結與心得
恭喜!你已經學會如何打造強韌且安全的程式。請記住,程式的品質取決於它處理異常輸入的能力。
需要掌握的核心概念為:
- 健壯性: 處理突發事件而不崩潰。
- 輸入驗證: 使用檢查機制(範圍、類型、長度、存在性、格式)來確保資料品質。
- 身分驗證: 確認身分,理想情況下應使用 2FA,並務必以雜湊方式安全儲存密碼。
- 維護性: 撰寫清晰且帶有註解的程式碼,以便日後更新與除錯。
請持續練習你的驗證檢查技巧,很快你就能寫出專業且可靠的程式了!