tag不存在或已被下架!
💡 今日學習目標:掌握 SEI (Software Engineering Institute) 後五大安全程式碼法則,理解最小權限原則與縱深防禦 (Defense in Depth) 的實務貫徹。
昨天我們介紹了 SEI Top 10 Secure Coding Practices 的前五條法則(輸入驗證、重視警告、安全架構、KISS 保持簡潔與預設拒絕)。
今天,我們繼續探討後五條法則(法則 6 ~ 10)。這五條法則專注於**「權限控制、邊界清洗、多層防護與品質標準」**,是讓程式碼從「能跑」跨越到「堅不可摧」的關鍵!

root 或 sa)權限連線資料庫!一旦發生 SQL 注入,駭客就能控制整台資料庫主機。// ❌ 壞習慣:用超級管理員帳號連線 DB
Database.Connect(user="root", password="...")
// ✅ 最小權限實踐:為應用程式建立限制權限的專用帳號
Database.Connect(user="app_read_write", password="...") // 只擁有特定 Table 的 SELECT/INSERT/UPDATE 權限,禁止 DROP / ALTER
💡 最小權限不是只有資料庫帳號。同一個原則,在你的系統裡至少還有四個地方適用:
- API Token / 金鑰:發給第三方的權杖,只給它真正需要的那幾個 scope,不要一律發全權。
- 雲端 IAM 角色:這台主機真的需要「讀取整個 S3 bucket」嗎?還是只要讀某一個路徑?
- 容器與服務帳號:容器裡不要用 root 跑你的應用程式,這是免費就能拿到的一層防護。
- 檔案系統權限:程式需要「讀」設定檔,那就別給它「寫」的權限。

很多人畫縱深防禦時,第一層會寫「前端表單驗證」。這是錯的。
前端驗證只是使用者體驗:它讓使用者在按下送出前就知道格式不對,省得白跑一趟。但攻擊者根本不會用你的網頁:他直接對 API 發一個 curl 請求,你的 JavaScript 完全沒有機會被執行。
🛡️ 一句話記住:前端驗證是給使用者的體貼,不是給攻擊者的防線。
你可以做,而且應該做,但絕對不能把它算進防禦層數裡。
上圖那六層的關鍵在於:它們彼此獨立,任何一層失守,下一層都還能單獨擋住。
舉個具體的例子。假設攻擊者送進一段 SQL 注入字串:
DROP 權限。這就是縱深防禦的價值:它讓「一個疏忽」不等於「一場災難」。
| 手段 | 擅長抓什麼 | 我們在哪一天做過 |
|---|---|---|
| SAST 靜態掃描 | 已知的危險寫法、硬編碼機密 | Day 09 - 11 |
| DAST 動態測試 | 執行時期才會現形的組態與行為問題 | — |
| Fuzzing 模糊測試 | 沒人想過的畸形輸入造成的崩潰 | — |
| 人工 Code Review | 商業邏輯與權限判斷的錯誤 | Day 06 |
📌 去找 SEI 的資料時,有件事要先知道。 十幾年來這些規則原始的網址是
wiki.sei.cmu.edu,網路上絕大多數教學、簡報甚至論文引用的都是那個網址。但那個站現在已經連不上了,請改從 SEI 官網進去。這剛好又是 Day 08 那個教訓的翻版:資料會搬家,引用它的文章不會跟著搬。 遇到連結打不開時,先去官網找現在的入口,而不是以為自己記錯了。
💡 給小團隊與個人開發者的務實版本:
「訂立標準」聽起來像大公司才做的事,但其實你在 Day 08 裝上 SonarQube for IDE 的那一刻,就已經在執行一套安全編碼標準了,它內建的那幾千條規則,正是別人幫你整理好的標準。你要做的只有兩件事:不要把跳出來的規則隨手關掉,以及在 Day 28 把它接進 CI,讓標準從「個人自律」變成「系統強制」。
💬 明日預告:【Day 15】OWASP Top 10 縱覽:2021 到 2025 的排名大洗牌
明天我們將進入業界最知名的資安榜單,看看四年之間,攻擊者的主戰場搬到哪裡去了!