cover

寫給每個覺得「安全是資安團隊的事」的開發者。

先講結論

資安的核心是一個習慣:寫完每個功能,花 30 秒問自己「這東西可以被怎麼濫用?」 不需要成為專家,但你得知道自己在防什麼。

「安全是他們的事」——最貴的誤解

OWASP 統計,80% 的安全漏洞來自程式碼層面。不是防火牆沒設好,不是伺服器被打穿——是你寫的 code 有洞。

資安團隊做的是審查和監控。漏洞?是你親手寫出來的。等到 code review 才發現要改架構,修復成本是開發階段的 10 倍以上。

所以問題不是「要不要學資安」,而是「你想在開發時花 5 分鐘想,還是上線後花 5 天修」。

CIA Triad——所有安全問題的三個面向

每次設計功能,用這三個維度掃一遍:

  • Confidentiality(機密性)——只有該看到的人能看到。密碼明文存、log 印出 API key、.env 推上 GitHub,全是這類問題
  • Integrity(完整性)——資料沒有被偷改。訂單金額被竄改、SQL injection,都是完整性被破壞
  • Availability(可用性)——需要用的時候用得到。DDoS 打掛、OOM crash、沒有 rate limiting

聽起來很教科書?但你上次設計 API 時,有想過「這個 endpoint 被打 1000 次/秒會怎樣」嗎?

威脅模型——系統化地想「誰會來搞我」

威脅模型不是什麼高深的東西,就是回答四個問題:

1. 我在做什麼?         → 系統架構、資料流
2. 什麼東西可能出錯?    → 威脅識別
3. 我要怎麼應對?       → 對策與優先順序
4. 我做得夠好嗎?       → 驗證

業界常用 STRIDE 分類法:Spoofing(偽裝身份)、Tampering(竄改資料)、Repudiation(否認行為)、Information Disclosure(資訊洩漏)、Denial of Service(阻斷服務)、Elevation of Privilege(提權)。

實際做法很簡單:拿出你的系統架構圖,在每個元件和每條資料流上跑一遍 STRIDE。「這裡能被偽裝嗎?資料能被竄改嗎?」——跑完你會發現,平常覺得沒問題的地方其實到處是洞。

縱深防禦——別把雞蛋放在同一道牆後面

     外部使用者
         │
    ┌────▼────┐
    │  WAF     │  ← 第一層:過濾明顯的惡意請求
    └────┬────┘
    ┌────▼────┐
    │ API GW   │  ← 第二層:認證、Rate Limiting
    └────┬────┘
    ┌────▼────┐
    │ App Code │  ← 第三層:Input Validation、權限檢查
    └────┬────┘
    ┌────▼────┐
    │ Database │  ← 第四層:Parameterized Query、最小權限
    └─────────┘

每一層都假設前一層已經被突破了。不要想「我有 WAF 所以不用管 SQL injection」,而是「即使 WAF 被繞過,我的 code 也不會讓注入得逞」。

同理,最小權限原則:API 服務別用 root 連 DB,Docker 別用 root 跑,CI/CD 別用 admin token。某個元件被攻破時,攻擊者只能在有限範圍內搞事。

安全是風險管理,不是零或一

「反正沒有 100% 安全,所以做了也沒用」——這是最常見的心態陷阱。

正確的思維:風險 = 威脅 × 漏洞 × 影響。你的目標不是零風險,而是識別最大的風險、降低最可能被利用的漏洞、限制被攻擊時的影響範圍。

你的 .env 檔裡有幾個 secret?如果被拿走,能造成多大損害?你的 API 有哪些 endpoint 只檢查了「有沒有登入」但沒檢查「是不是該使用者」?這些才是你該先修的。


資安最大的漏洞不是技術,是那句「應該不會有人攻擊我們吧」。

延伸閱讀