💡 今日學習目標:踏入階段三「資安是製造出來的」,理解卡內基梅隆大學 SEI 的 Secure Coding 哲學,建立一次就把程式碼寫對的防守心態。
歡迎來到階段三!

在階段二中,我們學會了用 SonarQube for IDE 與 SonarQube Community Build 來做資安「檢查」。但相信你在動手修 Hotspot 的時候,多少閃過這個念頭:
「如果當初在敲鍵盤時就寫對,現在就不需要花幾個小時去重構程式碼、重新編譯、重新測試了!」
這正是現代工業品質發展的第二階段:「品質是製造出來的(Manufacturing / Process)」。
1920 年代的製造業巨頭們發現,單靠工廠末端的品質檢查員(Inspection)無法降低不良率,唯一的解法是在生產線上改善工藝,讓工人在製造的第一時間就把事情做對。
軟體開發也是完全相同的道理:既然事後修漏洞那麼痛,為什麼不一開始就把 Code 寫好?
「安全程式碼(Secure Coding)」這件事,不是這幾年才被想出來的。
早在 2009 年,美國卡內基梅隆大學的 軟體工程研究所(SEI, Software Engineering Institute) 就發表了一份技術報告《Secure Design Patterns》(編號 CMU/SEI-2009-TR-010),系統性地整理出一套「把安全性做成固定樣式」的方法:從架構層、設計層一路到實作層,讓開發者可以像套用設計模式(Design Pattern)一樣,直接套用經過驗證的安全模式。
這份報告背後的主張其實很簡單,卻正好是整個階段三的起點:
安全不是等程式寫完之後再補上去的功能,而是應該在寫下每一行程式碼的當下,就一起被設計進去的性質。
你大概看過那張圖:漏洞越晚發現,修復成本一路飆升,到了上線階段變成 100 倍。
這個說法方向是對的,但它有一個幾乎所有人都省略掉的前提。而那個前提,對我們這種小團隊與個人開發者來說特別重要。

先講出處。網路上流傳最廣的版本,來源通常寫著「IBM Systems Sciences Institute 的研究」,但這份研究其實查不到原始文獻,最早的痕跡只是一則教科書註腳,後來被一路轉引,變成了大家都以為有根據的業界常識。
真正經得起查的來源,是 Barry Boehm 與 Victor Basili 發表在《IEEE Computer》(2001) 上的〈Software Defect Reduction Top 10 List〉。他們的結論是:
在交付之後才找到並修好一個問題,成本往往是在需求與設計階段處理的 100 倍左右。
但同一篇論文緊接著補了一句,而這句才是我們真正該記住的:
在小型、非關鍵的專案上,這個比例比較接近 5:1。
所以,如果你手上是個人專案或內部小系統,別人喊的「100 倍」對你來說確實是誇大的。
但 5 倍也還是 5 倍。 一件原本花你一小時的事,拖到上線後要花掉一整個工作天。
而且這還只算了「工時」。如果那個漏洞在上線後是被攻擊者搶先發現的,那你要付的就遠遠不只是工時了。
要在製造階段就寫出安全的程式碼,開發新手必須建立以下三個底層思維:
任何來自外部的資料(包括用戶輸入、URL 參數、HTTP Header、甚至資料庫查出來的欄位),在未經驗證前統統視為「可疑污點」。
不要假設「使用者一定會按照預期的格式填寫」。安全程式碼必須顯式地處理由非預期輸入引發的邊界情況。
不要自己發明密碼學演算法,不要自己寫複雜的正則過濾;堅決採用經過社群千錘百鍊的業界安全標準與函式庫。
💬 明日預告:【Day 13】SEI 10 大安全程式碼法則 (上):輸入驗證 (Validate Input) 與預設拒絕
明天我們將開始逐一拆解 SEI Top 10 Secure Coding Practices 的前五項黃金法則!