💡 今日學習目標:破解「資安只是資安部門或網管的事」的思維陷阱,理解「資安左移(Shift-Left Security)」與開發者的關鍵角色責任。
在許多企業或團隊中,當談到「系統安全」時,常會出現非常有趣的對話:
這正是許多組織的現狀:每個人都覺得資安很重要,但資安最後成了大家互相推卸的皮球。
說句老實話,上面這五個角色裡,最後那一個就是筆者。
Day 01 提過,筆者的日常大約是七成顧網路架構、三成顧資安。所以上面那五種說法,筆者不只全都聽過,其中好幾句自己也講過。也正因為每個位置的難處都待過,筆者很確定一件事:這不是誰特別不負責任,而是整個責任模型從一開始就搞錯了方向。
還記得 Day 01 結尾那座「忘了裝城門大鎖的城堡」嗎?
傳統資安對這個問題的答案非常直覺:把城牆蓋高一點、護城河挖深一點就好。
這就是所謂的 「城堡模型(Perimeter Security)」 :只要在網路邊界架設昂貴的防火牆(FW)與入侵偵測系統(IDS),把內網包得死死的,裡面跑的程式碼就算寫得不夠嚴謹,好像也無所謂。
然而在雲端化、API 化與遠端辦公的時代,邊界已經模糊。駭客攻擊不再只是硬撞防火牆,而是透過 Web 漏洞、合法 API 介面或供應鏈漏洞直攻心臟。
在傳統的軟體開發生命週期(SDLC)中,時間軸是從左流向右:
需求/訪談(左) ➔ 設計 ➔ 開發 ➔ 測試 ➔ 上線/維運(右)
如果把資安檢查放在最右端的「測試與上線前夕」,會帶來極高的成本與風險:
「資安左移」的核心通則:將資安的關注點與防守責任,向軟體開發時間軸的 左側(最早期) 推進。

許多開發新手會擔心:「我連駭客技術都不懂,我怎麼做資安?」
其實,資安防禦的第一線不是資安專家,而是寫下那行程式碼的開發者。
// ❌ 誤以為「網管設好防火牆,程式碼就不需要權限檢查」
Function DownloadOrderInvoice(orderId):
// 直接根據 orderId 撈取發票檔案並傳回,完全沒驗證目前登入者是誰
Return FileStore.Get("invoice_" + orderId + ".pdf")
⚠️ 後果:防火牆無法擋住這個攻擊!因為這是合法的 HTTP 80/443 埠號請求。只要攻擊者把
orderId從1001改成1002,就能看遍全公司的發票(即 IDOR 越權漏洞)。
// ✅ 開發者的資安防範:在程式碼中內建權限防禦
Function DownloadOrderInvoice(orderId, currentUser):
Order = Database.FindOrder(orderId)
// 開發者主動執行防守檢測:確認此訂單是否屬於當前使用者
If Order.OwnerId != currentUser.Id AND NOT currentUser.HasRole("Admin"):
AuditLog.Warn("Unauthorized access attempt by " + currentUser.Id)
Return Error(403, "Access Denied")
Return FileStore.Get("invoice_" + orderId + ".pdf")
💬 明日預告:【Day 03】當軟體品質遇上資安:從「品質觀念演進史」解密資安四大防守思維
明天我們將深入探討戴明與克勞斯比的「品質演進史」,看看資安如何一步步從「事後檢查」演進到「設計與管理」!