第四卷:極致驗證實證範例 —— 15 大測試套件與 93 項安全測試全景深度剖析 (Exhaustive Verification Matrix)

全書總標題:從 0 到 99/100:現代全端與雲原生架構的「近零可利用性(Near-Zero Exploitability)」實戰演進與 AI 紫隊工程指南
本卷定位:工業級自動化測試標準與 93 項測試案例全景手冊(ISO 29119 Test Matrix)
標準對標:ISO/IEC/IEEE 29119 (Software Testing) · ISO/IEC 25010 (System and Software Quality Models) · NIST SP 800-115
目標讀者:資深 QA 架構師、自動化測試工程師、安全審計員(Security Auditor)、DevSecOps 團隊


1. 軟體品質與測試標準體系 (ISO 29119 & ISO 25010)

在傳統敏捷開發中,單元測試多著重於「正向業務邏輯(Happy Path)」。然而在達到 99/100「近零可利用性」的驗證體系中,我們依據 ISO/IEC/IEEE 29119(軟體測試國際標準) 與 ISO/IEC 25010(軟體產品品質模型),將測試範疇全面擴展至「負向邊界(Negative Boundary)」、「惡意字串注入(Malicious Fuzzing)」與「密碼學完整性斷言」。

┌─────────────────────────────────────────────────────────────────────────┐
│                    ISO 25010 軟體安全與品質矩陣對應圖                   │
├──────────────────────┬──────────────────────────────────────────────────┤
│ 品質子特性 (Sub-char)│ 實作檢驗與防禦重點                               │
├──────────────────────┼──────────────────────────────────────────────────┤
│ 機密性 (Confidential)│ Token 零洩漏、草稿隱蔽 404、生產環境錯誤遮蔽     │
│ 完整性 (Integrity)   │ HMAC 防竄改、SQL 參數化、Zip Slip 目錄防逃逸     │
│ 抗否認性 (Non-rep)   │ 2FA TOTP RFC 6238 認證、時間戳綁定               │
│ 可用性 (Availability)│ 分散式原子限速防爆破、資料庫斷線記憶體優雅降級   │
│ 容錯性 (Fault-Tol)   │ 分類防自循環死鎖、標籤防孤兒保護、智慧合併衝突   │
└──────────────────────┴──────────────────────────────────────────────────┘

2. 全部 15 大測試套件與 93 項安全測試案例逐項全景詳解 (93/93 100% PASS)

+───────────────────────────────────────────────────────────────────────────────+
|                 15 大測試套件與 93 項安全測試全景矩陣 (實證範例)              |
+───────────────────────────────────────────────────────────────────────────────+
| 測試領域              | 測試套件 (Test Suite)            | 測試案例數 | 通過狀態 |
+───────────────────────┼──────────────────────────────────┼────────────┼──────────+
| 1. 身分鑑權與 2FA     | tests/unit/auth.test.ts          | 5 tests    | 100% PASS|
|                       | tests/unit/totp.test.ts          | 3 tests    | 100% PASS|
|                       | tests/integration/login-api.test | 5 tests    | 100% PASS|
|                       | tests/integration/setup-2fa.test | 3 tests    | 100% PASS|
+───────────────────────┼──────────────────────────────────┼────────────┼──────────+
| 2. 分散式限速與防爆破 | tests/unit/rate-limiter.test.ts  | 5 tests    | 100% PASS|
|                       | (包含跨節點 DB 原子限速整合)     |            |          |
+───────────────────────┼──────────────────────────────────┼────────────┼──────────+
| 3. 資料持久層與 SQL   | tests/unit/db.test.ts            | 4 tests    | 100% PASS|
|                       | tests/unit/categories-tags.test  | 24 tests   | 100% PASS|
|                       | tests/unit/tags-crud.test.ts     | 5 tests    | 100% PASS|
+───────────────────────┼──────────────────────────────────┼────────────┼──────────+
| 4. 資源存取與 SSRF    | tests/integration/posts-api.test | 5 tests    | 100% PASS|
|                       | tests/integration/tags-api.test  | 7 tests    | 100% PASS|
|                       | tests/integration/upload.test.ts | 3 tests    | 100% PASS|
|                       | tests/integration/backup-api.test| 3 tests    | 100% PASS|
|                       | tests/unit/exporter.test.ts      | 7 tests    | 100% PASS|
+───────────────────────┼──────────────────────────────────┼────────────┼──────────+
| 5. 錯誤遮蔽與綜合強化 | tests/unit/errors.test.ts        | 3 tests    | 100% PASS|
|                       | tests/integration/security-hard  | 11 tests   | 100% PASS|
+───────────────────────┴──────────────────────────────────┴────────────┴──────────+
| 總計 (Total Metrics)  | 15 Test Suites                   | 93 Tests   | 100% PASS|
+───────────────────────────────────────────────────────────────────────────────+

🔍 第一領域:身分鑑權與 2FA 密碼學矩陣(16 Tests)

1. `tests/unit/auth.test.ts` (5 Tests) — 密碼學核心單元測試

  • 測試 1:管理員密碼比對常數時間驗證
    • 測試目標:驗證 checkAdminPassword 能正確比對環境變數中的主密碼,且計算時間不隨輸入長度呈線性變化。
    • ISO 29119 分類:功能性等價劃分(Equivalence Partitioning)。
    • 技術斷言:正確密碼回傳 true,錯誤密碼回傳 false;底層由 crypto.timingSafeEqual 提供時序側信道保護。
  • 測試 2:簽發並驗證 2FA Session Token
    • 測試目標:驗證 generateSessionToken 生成具備毫秒級時間戳與 HMAC-SHA256 簽名之合法 Token。
    • ISO 29119 分類:有效性分析與密碼學簽章驗證。
    • 技術斷言:生成之 Token 格式嚴格符合 admin-authenticated:<timestamp>:<signature>,且傳入 verifySessionToken 必須為 true。
  • 測試 3:【關鍵安全防禦】禁止直接使用密碼當作 Token
    • 測試目標:徹底杜絕攻擊者跳過 2FA 動態碼驗證、直接將主密碼放入 Request Header 進行鑑權的繞過後門。
    • ISO 29119 分類:負向防繞過測試(Anti-Bypass Verification)。
    • 技術斷言:將未經 HMAC 簽章的純密碼傳入 verifySessionToken,強制斷言回傳 false。
  • 測試 4:拒絕偽造或竄改簽章的 Token
    • 測試目標:驗證任何被惡意竄改 timestamp 或 signature 尾碼的偽造 Token 均會被 HMAC 驗證演算法識破。
    • ISO 29119 分類:資料完整性與防竄改(Tamper-Resistance)。
    • 技術斷言:修改簽章尾部任一字元,verifySessionToken 必須立即回傳 false。
  • 測試 5:拒絕格式不符或過期的 Token
    • 測試目標:驗證 Token 超過 3 天有效期限(Max-Age: 259,200,000 ms)或缺少分隔冒號時自動拒絕。
    • ISO 29119 分類:邊界值分析(Boundary Value Analysis)。
    • 技術斷言:傳入 4 天前時間戳或格式錯誤字串,強制回傳 false。

2. `tests/unit/totp.test.ts` (3 Tests) — RFC 6238 TOTP 演算法標準

  • 測試 6:當前時間週期動態碼生成與驗證
    • 測試目標:驗證 TOTP 動態碼在標準 30 秒步長(Time-Step Window)內與伺服器演算法精確吻合。
    • ISO 29119 分類:RFC 6238 演算法合規測試。
    • 技術斷言:由 generate() 產出之 6 位數代碼,傳入 verifyTOTP 必須回傳 true。
  • 測試 7:拒絕錯誤或隨機 6 碼數字
    • 測試目標:確保非當前金鑰產生的 6 位數或偽造動態碼一律無法通過校驗。
    • ISO 29119 分類:負向無效輸入測試。
    • 技術斷言:傳入隨機數字字串如 '000000',強制回傳 false。
  • 測試 8:生成 2FA QR Code Data URL 與 URI
    • 測試目標:驗證支援 Google Authenticator 的標準 otpauth://totp/... 協定生成。
    • ISO 29119 分類:互通性測試(Interoperability)。
    • 技術斷言:回傳之 qrDataUrl 必須以 data:image/png;base64, 開頭且包含合法 PNG 二進位資料。

3. `tests/integration/login-api.test.ts` (5 Tests) — 登入與防爆破整合測試

  • 測試 9 (TC-LOGIN-001):密碼錯誤時拒絕登入 (401 Unauthorized)
    • 測試目標:密碼不符時立即阻斷,回傳 401 並計算剩餘嘗試次數。
  • 測試 10 (TC-LOGIN-002):2FA 動態碼錯誤或為空時拒絕登入 (401 Unauthorized)
    • 測試目標:密碼正確但未輸入或輸入過期 2FA 代碼時拒絕簽發憑證。
  • 測試 11 (TC-LOGIN-003):密碼與 2FA 均正確時成功登入並設定 HttpOnly Cookie (200 OK)
    • 測試目標:驗證全站最核心的憑證隔離防禦 —— 伺服器注入 HttpOnly; Secure; SameSite=Strict Cookie,且 JSON Body 嚴格斷言 expect(data.token).toBeUndefined()。
  • 測試 12 (TC-LOGIN-004):[防暴力破解] 連續失敗達 5 次時觸發全域 15 分鐘鎖定 (429 Too Many Requests)
    • 測試目標:驗證階梯式限速計數(前 4 次失敗回傳 401 遞減次數,第 5 次失敗觸發全域鎖定,第 6 次即使帳密皆對依然 429 拒絕)。
  • 測試 13 (TC-LOGIN-005):成功登入後清除先前的失敗計數
    • 測試目標:驗證合法管理員登入成功後,資料庫與記憶體中的失敗計數原子化清零。

4. `tests/integration/setup-2fa.test.ts` (3 Tests) — 2FA 綁定端點存取控制

  • 測試 14:未攜帶 Session Token 呼叫 /api/auth/setup-2fa 強制回傳 401
    • 測試目標:修復「2FA 密鑰未鑑權洩漏」漏洞,確保訪客無法探測綁定 QR Code。
  • 測試 15:傳遞偽造或無效 Session Token 強制回傳 401
    • 測試目標:驗證偽造 Token 無法繞過 2FA 設置介面。
  • 測試 16:攜帶有效 Session Token 成功取得 QR Code 與 Secret
    • 測試目標:合法已登入管理員能正常重新綁定 2FA。

🔍 第二領域:分散式限速與防暴力破解矩陣(5 Tests)

5. `tests/unit/rate-limiter.test.ts` (5 Tests) — 分散式節點防禦與 IP 解析

  • 測試 17 (TC-LIMIT-001):初始狀態下 IP 不應處於鎖定狀態
    • 測試目標:驗證新 IP 的初始計數基準值。
  • 測試 18 (TC-LIMIT-002):記錄失敗次數遞增,達到 5 次時回傳 locked: true
    • 測試目標:驗證限速器在閾值到達時的狀態轉換(State Transition)。
  • 測試 19 (TC-LIMIT-003):鎖定期間經過 15 分鐘後自動解除鎖定
    • 測試目標:驗證滑動窗口(Sliding Window)過期自動釋放邏輯。
  • 測試 20 (TC-LIMIT-004):recordSuccess 應立即清除失敗紀錄
    • 測試目標:確保正常作業不受殘餘失敗記錄干擾。
  • 測試 21 (TC-LIMIT-005):getClientIp 邊緣代理標頭多重優先級解析
    • 測試目標:驗證 IP 提取依序遵循 x-real-ip -> x-vercel-ip -> cf-connecting-ip -> x-forwarded-for,杜絕攻擊者藉由偽造 Client Header 欺騙限速器。

🔍 第三領域:資料持久層與 SQL 注入防禦矩陣(33 Tests)

6. `tests/unit/db.test.ts` (4 Tests) — 資料庫持久層核心測試

  • 測試 22 (TC-DB-001):initDB 應正確執行資料表與索引建置語法 (9 次 SQL)
    • 測試目標:驗證全站 Schema DDL 語法完整性,確保 login_attempts 分散式限速表與文章、分類、標籤及其關聯索引正確建立。
  • 測試 23 (TC-DB-002):getAllPosts 應能分別以公開模式與全部模式查詢
    • 測試目標:驗證公開模式僅查詢 published = true,管理模式可查詢全量文章。
  • 測試 24 (TC-DB-003):getPostBySlug 與 getPostById 查詢操作
    • 測試目標:驗證單篇文章查詢與關聯標籤 JSON 聚合(json_agg)之正確性。
  • 測試 25 (TC-DB-004):createPost、updatePost、deletePost 原子操作
    • 測試目標:驗證 CRUD 操作皆透過參數化模板標籤執行,杜絕 SQL 語法注入。

7. `tests/unit/categories-tags.test.ts` (24 Tests) — 階層分類、標籤與 Slug 安全轉換

  • 測試 26~29 (TC-SLUG-001 ~ TC-SLUG-004):Slug 轉換演算法安全與邊界測試
    • 測試目標:驗證英文空格、特殊符號、中文字符、混合字符及空字串均能生成合規且安全的 URL Slug(去除首尾連字號,防範 XSS/路徑注入)。
  • 測試 30~34 (TC-CAT-001 ~ TC-CAT-005):分類查詢與巢狀樹狀結構轉換
    • 測試目標:驗證平坦資料庫記錄能正確遞迴組裝為多層級父子樹狀物件,且無資料時回傳安全空陣列。
  • 測試 35~37 (TC-CAT-006 ~ TC-CAT-008):子分類建立與防自循環(Circular Dependency)保護
    • 測試目標:當使用者誤將 parent_id 設為自己時,系統自動修正為 null,防範無限遞迴造成伺服器 Stack Overflow 崩潰。
  • 測試 38~40 (TC-CAT-009 ~ TC-CAT-011):分類刪除防孤兒(Orphan Prevention)保護
    • 測試目標:驗證 uncategorize 模式下子分類自動升級為頂層分類、關聯文章設為未分類;reassign 模式下將文章安全移交給目標分類。
  • 測試 41~45 (TC-TAG-001 ~ TC-TAG-005):標籤查詢與自由標籤 Upsert 機制
    • 測試目標:驗證已存在標籤不重複 INSERT、不存在標籤自動建立、空陣列不呼叫 SQL,以及重複標籤名稱自動去重。
  • 測試 46~49 (TC-TAG-006 ~ TC-TAG-009):文章標籤關聯原子化同步
    • 測試目標:驗證文章編輯時,先原子清除舊關聯再寫入新關聯,無關聯時安全回傳空陣列。

8. `tests/unit/tags-crud.test.ts` (5 Tests) — 標籤管理與智慧合併

  • 測試 50 (TC-TAG-CRUD-001):查詢單一標籤
    • 測試目標:驗證合法標籤查詢與不存在時的 null 安全處理。
  • 測試 51 (TC-TAG-CRUD-002):標籤一般更名
    • 測試目標:新名稱未衝突時安全更新 name 與 slug。
  • 測試 52 (TC-TAG-CRUD-003):智慧合併(Smart Merge)
    • 測試目標:當標籤更名為已存在的同名標籤時,系統自動將關聯文章轉移至目標標籤,並刪除冗餘舊標籤(防止主鍵衝突崩潰)。
  • 測試 53 (TC-TAG-CRUD-004):標籤安全解綁刪除
    • 測試目標:刪除標籤時僅清除 post_tags 關聯,文章本體 100% 完整保留。
  • 測試 54 (TC-TAG-CRUD-005):一鍵清理孤立標籤
    • 測試目標:批次刪除 0 篇文章引用的未用標籤,回傳精確刪除筆數。

🔍 第四領域:資源存取控制、檔案上傳與 SSRF 防禦矩陣(25 Tests)

9. `tests/integration/posts-api.test.ts` (5 Tests) — 文章業務邏輯與 API 存取控制

  • 測試 55 (TC-POSTS-001):公開端點 GET /api/posts 成功回傳文章清單 (200 OK)
    • 測試目標:驗證未登入訪客能正常瀏覽公開文章。
  • 測試 56 (TC-POSTS-002):未授權發起 POST /api/posts 強制回傳 401 Unauthorized
    • 測試目標:驗證非管理員無法建立文章。
  • 測試 57 (TC-POSTS-003):攜帶合法 Token 成功建立文章 (201 Created)
    • 測試目標:驗證合法管理員之文章建立與標籤同步流程。
  • 測試 58 (TC-POSTS-004):查詢不存在之文章 ID 回傳 404 Not Found
    • 測試目標:驗證邊界值與例外資源處理。
  • 測試 59 (TC-POSTS-005):PUT 與 DELETE /api/posts/[id] 授權驗證與操作
    • 測試目標:驗證文章修改與刪除之身分認證。

10. `tests/integration/tags-api.test.ts` (7 Tests) — 標籤 API 端點權限防護

  • 測試 60~66 (TC-TAG-API-001 ~ TC-TAG-API-007):標籤更新、刪除與清理之授權與流程驗證
    • 測試目標:對 PUT / DELETE / Cleanup 端點分別驗證「未授權拒絕 (401)」與「授權通過 (200 OK)」,確保標籤管理功能不被越權操作。

11. `tests/integration/upload.test.ts` (3 Tests) — 檔案上傳安全性與白名單過濾

  • 測試 67:未攜帶合法 Session Token 上傳直接拒絕 (401)
    • 測試目標:杜絕未授權訪客將伺服器當作圖床濫用。
  • 測試 68:禁止上傳非白名單格式 (如 executable / html / script / svg) (400)
    • 測試目標:徹底杜絕 WebShell 上傳與 SVG 內嵌腳本引發的 Stored XSS 攻擊。
  • 測試 69:合法點陣圖片 (PNG / JPEG) 在授權下成功上傳
    • 測試目標:驗證合法檔案隨機化重命名後寫入 Object Storage。

12. `tests/integration/backup-api.test.ts` (3 Tests) — 備份匯出端點安全

  • 測試 70 (TC-BACKUP-001):未授權呼叫 GET /api/backup 拒絕並回傳 401
    • 測試目標:防止全站資料被未授權下載。
  • 測試 71 (TC-BACKUP-002):偽造或錯誤 Token 拒絕 (401)
    • 測試目標:防止無效 Token 滲透。
  • 測試 72 (TC-BACKUP-003):帶合法 Token 成功回傳 200 及 ZIP 二進位串流
    • 測試目標:合法管理員可順利打包全站文章與資產。

13. `tests/unit/exporter.test.ts` (7 Tests) — 備份解析、SSRF 防禦與 Zip Slip 防護

  • 測試 73 (TC-EXP-001):多層級分類路徑解析
    • 測試目標:驗證備份目錄結構如 漏洞研究/PoC開發/ 之遞迴路徑計算。
  • 測試 74 (TC-EXP-002):空分類陣列邊界處理
    • 測試目標:確保無分類時回傳安全空結構。
  • 測試 75 (TC-EXP-003):圖片 URL 多語法提取
    • 測試目標:同時精確解析 Markdown 語法 ![alt](url)、封面 URL 與 HTML <img src="url"> 標籤。
  • 測試 76 (TC-EXP-004):無圖片時回傳空陣列
    • 測試目標:邊界防禦。
  • 測試 77 (TC-EXP-005):生成合法 YAML Frontmatter 與正文
    • 測試目標:確保匯出之 Markdown 檔案符合標準元數據規範。
  • 測試 78 (TC-EXP-006):圖片路徑改寫為相對路徑
    • 測試目標:將遠端 HTTPS 圖片改寫為 ../../assets/xxx.png 本地離線可攜格式。
  • 測試 79 (TC-EXP-007):生成含 manifest.json 與結構化文章之 ZIP Buffer
    • 測試目標:驗證壓縮檔結構完整性與校驗和生成。

🔍 第五領域:錯誤遮蔽與綜合安全強化矩陣(14 Tests)

14. `tests/unit/errors.test.ts` (3 Tests) — 資訊遮蔽與錯誤處理

  • 測試 80 (TC-ERR-001):[正式環境資訊遮蔽] 正式環境 (production) 必須隱蔽內部 DB 帳密與 SQL 報錯
    • 測試目標:驗證 safeErrorResponse 在正式環境僅回傳模糊訊息,伺服器 Log 記錄細節,杜絕 CWE-209 資訊洩漏。
  • 測試 81 (TC-ERR-002):[開發環境透明除錯] 開發環境 (development) 允許回傳詳細錯誤
    • 測試目標:確保開發時能即時排錯。
  • 測試 82 (TC-ERR-003):[非 Error 物件防護] 捕捉字串或未知型別異常時正確包裝
    • 測試目標:防止第三方套件拋出非標準 Error 導致進程未捕獲崩潰。

15. `tests/integration/security-hardening.test.ts` (11 Tests) — 紅隊高危攻擊專項攔截驗證

  • 測試 83 (TC-SEC-001):傳入 SQL 注入字串 (如 ' OR 1=1 --) 至 categoryId 立即拋出格式錯誤並攔截
    • 測試目標:驗證動態查詢正則強校驗,杜絕 SQL 注入。
  • 測試 84 (TC-SEC-002):傳入 SQL 注入字串至 tagId 立即拋出格式錯誤並攔截
    • 測試目標:驗證標籤篩選端點之 SQL 注入防護。
  • 測試 85 (TC-SEC-003):未攜帶 Token 呼叫 GET /api/init 強制回傳 401
    • 測試目標:防止未授權訪客重複觸發資料表初始化 DDL。
  • 測試 86 (TC-SEC-004):未攜帶 Token 呼叫 GET /api/seed 強制回傳 401
    • 測試目標:防止未授權訪客向資料庫注入測試種子資料。
  • 測試 87 (TC-SEC-005):攜帶合法 2FA Token 呼叫 GET /api/init 成功通過 (200 OK)
    • 測試目標:驗證管理端合法初始化流程。
  • 測試 88 (TC-SEC-006):拒絕 application/octet-stream 通用二進位格式上傳 (400)
    • 測試目標:禁止上傳未知二進位檔案。
  • 測試 89 (TC-SEC-007):拒絕 image/svg+xml 格式上傳 (400)
    • 測試目標:徹底杜絕 SVG 內嵌 JavaScript 造成的 Stored XSS 攻擊。
  • 測試 90 (TC-SEC-008):允許安全的點陣圖片格式 (PNG, JPEG, WEBP, GIF, AVIF) (200 OK)
    • 測試目標:驗證標準圖片白名單機制。
  • 測試 91 (TC-SEC-009):[草稿隱蔽] 未登入訪客請求未公開草稿 (published: false) 嚴格回傳 404
    • 測試目標:防止攻擊者透過 401/403 響應探測未公開草稿的 ID 與存在性。
  • 測試 92 (TC-SEC-010):[授權檢視] 攜帶有效 2FA Token 請求未公開草稿允許存取 (200 OK)
    • 測試目標:管理員能正常預覽未發布之文章內容。
  • 測試 93 (TC-SEC-011):sanitizePathSegment 徹底清理 ../, ..\, 特殊符號防範 Zip Slip 路徑逃脫
    • 測試目標:杜絕目錄遍歷攻擊,防止解壓縮時覆蓋伺服器關鍵系統檔案。