OWASP Top 10 (2025):網站安全的完整指南
深入解析 OWASP Top 10 2025 版本的全部安全檢查項目,從 Broken Access Control 到 Mishandling of Exceptional Conditions,了解每個風險的成因與防護方法。
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 就能查看任何人的資料
❌ 前端隱藏 ≠ 安全
隱藏的管理員按鈕,但後端沒有驗證權限
如何防護?
- 預設拒絕:沒有明確授權的資源一律禁止存取
- 每個請求都驗證:不要假設用戶已登入就代表有權限
- 使用 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 攻擊 |
如何防護?
- 移除預設設定:更改預設帳號密碼、移除範例頁面
- 最小權限原則:只開啟必要的功能
- 設定安全標頭: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 套件(如
lodashvs1odash) - 劫持被遺棄的套件
真實案例
| 事件 | 影響 |
|---|---|
| event-stream (2018) | 惡意程式碼竊取比特幣錢包 |
| ua-parser-js (2021) | 植入挖礦程式 |
| colors.js (2022) | 開發者故意破壞自己的套件 |
如何防護?
- 使用 lockfile:
package-lock.json鎖定依賴版本 - 定期審計:
npm audit檢查已知漏洞 - 驗證套件來源:檢查下載量、維護者、最後更新時間
- 使用私有 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 = '';
-- 結果:繞過密碼驗證!
如何防護?
- 使用參數化查詢:永遠不要用字串拼接 SQL
- 驗證和清理輸入:拒絕不符合格式的資料
- 使用 CSP 標頭:防止 XSS 攻擊
- 採用 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 |
| 無異常偵測 | 異常行為無法被察覺 |
| 信任用戶端資料 | 資料可被竄改 |
| 缺乏多層防禦 | 單點突破=全面淪陷 |
如何防護?
- 威脅建模:在設計階段識別潛在威脅
- 安全設計模式:採用經過驗證的設計模式
- 深度防禦:多層次的安全控制
- 最小權限:每個元件只給予必要權限
設計檢查清單
- 是否有速率限制?
- 是否有異常行為偵測?
- 是否所有資料都在伺服器端驗證?
- 是否採用最小權限原則?
A07:2025 - Authentication Failures(身份驗證失效)
這是什麼?
Authentication Failures 涵蓋了與身份驗證相關的所有弱點:
- 允許弱密碼(如
123456) - 無登入嘗試次數限制
- Session 管理不當
- 缺乏多因素驗證(MFA)
常見攻擊方式
| 攻擊 | 說明 |
|---|---|
| 暴力破解 | 大量嘗試密碼組合 |
| 憑證填充 | 使用外洩的帳密嘗試登入 |
| Session 劫持 | 竊取使用者的 Session Token |
如何防護?
- 強制強密碼:至少 8 字元,包含大小寫和符號
- 啟用 MFA:重要帳號必須使用雙因素驗證
- 限制登入嘗試:失敗 N 次後鎖定或延遲
- 安全的 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 流程被入侵
- 沒有驗證更新來源
- 反序列化不安全的資料
如何防護?
- 驗證套件完整性:使用 checksum 或簽章
- 保護 CI/CD:嚴格控制誰能修改建置流程
- 驗證反序列化資料:不信任任何外部來源的序列化資料
- 使用程式碼簽章:確保程式碼來自可信來源
# 確保 lockfile 一致
npm ci # 比 npm install 更嚴格
# 驗證套件完整性
npm audit signatures
A09:2025 - Security Logging and Alerting Failures(安全日誌與警報失效)
這是什麼?
如果你的系統被入侵了,但沒有任何日誌記錄,你可能:
- 不知道系統已被入侵
- 無法追蹤攻擊者的行為
- 無法通知受影響的使用者
- 無法進行事後分析
應該記錄什麼?
| 事件 | 原因 |
|---|---|
| 登入成功/失敗 | 偵測暴力破解或帳號盜用 |
| 權限變更 | 偵測提權攻擊 |
| 敏感資料存取 | 追蹤資料外洩 |
| 輸入驗證失敗 | 偵測注入攻擊嘗試 |
| 系統異常 | 偵測異常行為 |
如何防護?
- 記錄關鍵事件:登入、權限變更、資料存取
- 設定警報:異常行為即時通知
- 集中管理日誌:使用 ELK Stack 或雲端服務
- 保護日誌:防止攻擊者刪除或竄改
注意事項
⚠️ 不要記錄的資料:
- 密碼(即使是雜湊後的)
- Session Token
- 信用卡號
- 其他敏感個資
A10:2025 - Mishandling of Exceptional Conditions(例外狀況處理不當)
這是什麼?
這是 2025 年的新項目,關注程式對非預期情況的處理方式。處理不當可能導致:
- 系統崩潰(DoS 攻擊)
- 洩露敏感資訊(如堆疊追蹤)
- 進入不安全的狀態
- 繞過安全控制
常見問題
| 問題 | 風險 |
|---|---|
| 顯示堆疊追蹤 | 洩露系統內部結構 |
| 忽略錯誤 | 系統進入不一致狀態 |
| 通用錯誤處理 | 吞掉重要的錯誤訊息 |
| 無優雅降級 | 單點故障導致全系統崩潰 |
如何防護?
- 具體處理錯誤:不要用通用的 catch-all
- 安全失敗:遇到錯誤時拒絕請求,而非放行
- 隱藏技術細節:對用戶顯示友善訊息,內部記錄詳細資訊
- 設計容錯機制: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 不只是一份檢查清單,更是一種安全思維。將這些原則內化到日常開發中,才能打造真正安全的應用程式。