Skip to content
Anonymous

OWASP Top 10 (2025):網站安全的完整指南

深入解析 OWASP Top 10 2025 版本的全部安全檢查項目,從 Broken Access Control 到 Mishandling of Exceptional Conditions,了解每個風險的成因與防護方法。

#security #owasp #web-development #best-practices

OWASP Top 10 (2025):網站安全的完整指南

如果你是網站開發者,「OWASP」這個名詞一定不陌生。OWASP(Open Worldwide Application Security Project)是一個致力於提升軟體安全的非營利組織,而 OWASP Top 10 則是他們定期發布的「十大網站應用程式安全風險」清單。

本文將完整解析 2025 年版本的 OWASP Top 10。


什麼是 OWASP Checks?

OWASP Checks 是一套標準化的安全審計檢查清單,用於評估網站或應用程式是否存在常見的安全漏洞。這些檢查項目基於真實世界的攻擊案例和安全研究,幫助開發者識別和修復潛在的安全問題。

為什麼要做 OWASP 檢查?

優點說明
🛡️ 降低被駭風險提前發現並修復漏洞,避免資料外洩
📋 標準化審計提供統一的檢查標準,方便團隊協作
💰 節省成本開發階段修復比上線後修復便宜 10-100 倍
🏆 符合規範許多產業標準(如 PCI-DSS)要求符合 OWASP

A01:2025 - Broken Access Control(權限控制失效)

這是什麼?

Access Control(存取控制)是指系統確保使用者「只能存取他們被授權的資源」的機制。當這個機制失效時,攻擊者可能:

  • 查看其他使用者的私人資料
  • 修改他人的帳號資訊
  • 存取管理員功能

常見漏洞情境

❌ 不安全的 API 設計
GET /api/users/12345/profile
→ 攻擊者只需更改 ID 就能查看任何人的資料

❌ 前端隱藏 ≠ 安全
隱藏的管理員按鈕,但後端沒有驗證權限

如何防護?

  1. 預設拒絕:沒有明確授權的資源一律禁止存取
  2. 每個請求都驗證:不要假設用戶已登入就代表有權限
  3. 使用 RBAC:角色型存取控制(Role-Based Access Control)

實務範例

// ❌ 錯誤:沒有驗證權限
app.get('/admin/users', async (req, res) => {
  const users = await db.getAllUsers();
  res.json(users);
});

// ✅ 正確:驗證使用者角色
app.get('/admin/users', requireRole('admin'), async (req, res) => {
  const users = await db.getAllUsers();
  res.json(users);
});

A02:2025 - Security Misconfiguration(安全配置錯誤)

這是什麼?

Security Misconfiguration 是指系統因為錯誤的設定而暴露安全風險。這通常是人為疏忽造成的:

  • 使用預設密碼
  • 開啟不必要的功能或服務
  • 顯示詳細錯誤訊息給使用者
  • 忘記關閉 Debug 模式

常見問題

問題風險
預設帳號密碼攻擊者可直接登入
Debug 模式開啟洩露系統內部資訊
目錄列表開啟攻擊者可瀏覽所有檔案
缺少安全標頭容易被 XSS、Clickjacking 攻擊

如何防護?

  1. 移除預設設定:更改預設帳號密碼、移除範例頁面
  2. 最小權限原則:只開啟必要的功能
  3. 設定安全標頭:X-Content-Type-Options、X-Frame-Options 等

安全標頭範例

Content-Security-Policy: default-src 'self'
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin

A03:2025 - Software Supply Chain Failures(軟體供應鏈失效)

這是什麼?

這是 2025 年的新項目,強調現代軟體開發中對第三方元件的依賴風險。攻擊者可能:

  • 入侵上游套件並植入惡意程式碼
  • 發布惡意的 lookalike 套件(如 lodash vs 1odash
  • 劫持被遺棄的套件

真實案例

事件影響
event-stream (2018)惡意程式碼竊取比特幣錢包
ua-parser-js (2021)植入挖礦程式
colors.js (2022)開發者故意破壞自己的套件

如何防護?

  1. 使用 lockfilepackage-lock.json 鎖定依賴版本
  2. 定期審計npm audit 檢查已知漏洞
  3. 驗證套件來源:檢查下載量、維護者、最後更新時間
  4. 使用私有 registry:企業可使用 Artifactory 或 Verdaccio
# 檢查依賴漏洞
npm audit

# 自動修復
npm audit fix

# 查看過期套件
npm outdated

A04:2025 - Cryptographic Failures(加密失效)

這是什麼?

Cryptographic Failures 是指敏感資料因為加密不足或錯誤而被洩露。這包括:

  • 密碼以明文儲存
  • 使用過時的加密演算法(如 MD5、SHA1)
  • 缺少 HTTPS
  • API 金鑰寫死在程式碼中

敏感資料處理方式

資料類型應該如何處理
密碼使用 bcrypt 或 Argon2 雜湊
信用卡號使用 PCI-DSS 合規的加密
個資傳輸時加密(TLS)、儲存時加密
API 金鑰使用環境變數,不要寫進程式碼

實務範例

// ❌ 錯誤:使用 MD5 雜湊密碼(容易被破解)
const hash = crypto.createHash('md5').update(password).digest('hex');

// ✅ 正確:使用 bcrypt(抗暴力破解)
const hash = await bcrypt.hash(password, 12);

A05:2025 - Injection(注入攻擊)

這是什麼?

Injection 是最經典的攻擊手法之一。攻擊者將惡意資料「注入」到應用程式中,讓系統執行非預期的指令。常見類型:

  • SQL Injection:在 SQL 查詢中注入惡意語法
  • XSS(Cross-Site Scripting):在網頁中注入惡意 JavaScript
  • Command Injection:在系統指令中注入惡意命令
  • LDAP Injection:在 LDAP 查詢中注入惡意語法

SQL Injection 範例

-- 正常登入查詢
SELECT * FROM users WHERE username = 'admin' AND password = '1234';

-- 攻擊者輸入:admin' OR '1'='1
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = '';
-- 結果:繞過密碼驗證!

如何防護?

  1. 使用參數化查詢:永遠不要用字串拼接 SQL
  2. 驗證和清理輸入:拒絕不符合格式的資料
  3. 使用 CSP 標頭:防止 XSS 攻擊
  4. 採用 ORM:使用 Prisma、Sequelize 等框架
// ❌ 錯誤:字串拼接(容易被 SQL Injection)
const users = await db.query(`SELECT * FROM users WHERE id = ${req.params.id}`);

// ✅ 正確:參數化查詢
const users = await db.query('SELECT * FROM users WHERE id = $1', [req.params.id]);

A06:2025 - Insecure Design(不安全的設計)

這是什麼?

Insecure Design 是指在設計階段就存在的安全缺陷,無法透過實作來彌補。這是「先天缺陷」而非「後天疏忽」。

常見問題

設計缺陷風險
無速率限制被暴力破解或 DDoS
無異常偵測異常行為無法被察覺
信任用戶端資料資料可被竄改
缺乏多層防禦單點突破=全面淪陷

如何防護?

  1. 威脅建模:在設計階段識別潛在威脅
  2. 安全設計模式:採用經過驗證的設計模式
  3. 深度防禦:多層次的安全控制
  4. 最小權限:每個元件只給予必要權限

設計檢查清單

  • 是否有速率限制?
  • 是否有異常行為偵測?
  • 是否所有資料都在伺服器端驗證?
  • 是否採用最小權限原則?

A07:2025 - Authentication Failures(身份驗證失效)

這是什麼?

Authentication Failures 涵蓋了與身份驗證相關的所有弱點:

  • 允許弱密碼(如 123456
  • 無登入嘗試次數限制
  • Session 管理不當
  • 缺乏多因素驗證(MFA)

常見攻擊方式

攻擊說明
暴力破解大量嘗試密碼組合
憑證填充使用外洩的帳密嘗試登入
Session 劫持竊取使用者的 Session Token

如何防護?

  1. 強制強密碼:至少 8 字元,包含大小寫和符號
  2. 啟用 MFA:重要帳號必須使用雙因素驗證
  3. 限制登入嘗試:失敗 N 次後鎖定或延遲
  4. 安全的 Session 管理:使用安全 Cookie 設定
// 安全的 Cookie 設定
res.cookie('session', token, {
  httpOnly: true,    // 防止 XSS 存取
  secure: true,      // 僅限 HTTPS
  sameSite: 'strict', // 防止 CSRF
  maxAge: 3600000    // 1 小時過期
});

A08:2025 - Software or Data Integrity Failures(軟體或資料完整性失效)

這是什麼?

這個類別關注的是「你的程式碼和資料是否被竄改」。問題可能來自:

  • 使用未經驗證的第三方套件
  • CI/CD 流程被入侵
  • 沒有驗證更新來源
  • 反序列化不安全的資料

如何防護?

  1. 驗證套件完整性:使用 checksum 或簽章
  2. 保護 CI/CD:嚴格控制誰能修改建置流程
  3. 驗證反序列化資料:不信任任何外部來源的序列化資料
  4. 使用程式碼簽章:確保程式碼來自可信來源
# 確保 lockfile 一致
npm ci  # 比 npm install 更嚴格

# 驗證套件完整性
npm audit signatures

A09:2025 - Security Logging and Alerting Failures(安全日誌與警報失效)

這是什麼?

如果你的系統被入侵了,但沒有任何日誌記錄,你可能:

  • 不知道系統已被入侵
  • 無法追蹤攻擊者的行為
  • 無法通知受影響的使用者
  • 無法進行事後分析

應該記錄什麼?

事件原因
登入成功/失敗偵測暴力破解或帳號盜用
權限變更偵測提權攻擊
敏感資料存取追蹤資料外洩
輸入驗證失敗偵測注入攻擊嘗試
系統異常偵測異常行為

如何防護?

  1. 記錄關鍵事件:登入、權限變更、資料存取
  2. 設定警報:異常行為即時通知
  3. 集中管理日誌:使用 ELK Stack 或雲端服務
  4. 保護日誌:防止攻擊者刪除或竄改

注意事項

⚠️ 不要記錄的資料:
- 密碼(即使是雜湊後的)
- Session Token
- 信用卡號
- 其他敏感個資

A10:2025 - Mishandling of Exceptional Conditions(例外狀況處理不當)

這是什麼?

這是 2025 年的新項目,關注程式對非預期情況的處理方式。處理不當可能導致:

  • 系統崩潰(DoS 攻擊)
  • 洩露敏感資訊(如堆疊追蹤)
  • 進入不安全的狀態
  • 繞過安全控制

常見問題

問題風險
顯示堆疊追蹤洩露系統內部結構
忽略錯誤系統進入不一致狀態
通用錯誤處理吞掉重要的錯誤訊息
無優雅降級單點故障導致全系統崩潰

如何防護?

  1. 具體處理錯誤:不要用通用的 catch-all
  2. 安全失敗:遇到錯誤時拒絕請求,而非放行
  3. 隱藏技術細節:對用戶顯示友善訊息,內部記錄詳細資訊
  4. 設計容錯機制:Circuit Breaker、Retry with Backoff
// ❌ 錯誤:洩露堆疊追蹤
app.use((err, req, res, next) => {
  res.status(500).json({ error: err.stack });
});

// ✅ 正確:對用戶友善,內部記錄詳情
app.use((err, req, res, next) => {
  console.error('Error:', err);  // 內部日誌
  res.status(500).json({ 
    error: 'An unexpected error occurred. Please try again.' 
  });
});

總結

項目風險防護重點
A01 Broken Access Control越權存取每個請求驗證權限
A02 Security Misconfiguration系統暴露移除預設設定、安全標頭
A03 Supply Chain Failures惡意套件審計依賴、使用 lockfile
A04 Cryptographic Failures資料外洩使用強加密、強制 HTTPS
A05 Injection系統被控制參數化查詢、驗證輸入
A06 Insecure Design先天缺陷威脅建模、深度防禦
A07 Authentication Failures帳號被盜強密碼、MFA、限制嘗試
A08 Data Integrity Failures程式被竄改驗證完整性、保護 CI/CD
A09 Logging Failures入侵難察覺記錄關鍵事件、設定警報
A10 Exception Handling系統不穩定安全失敗、優雅降級

OWASP Top 10 不只是一份檢查清單,更是一種安全思維。將這些原則內化到日常開發中,才能打造真正安全的應用程式。


延伸閱讀