# 第四卷：極致驗證實證範例 —— 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 路徑逃脫**  
  * **測試目標**：杜絕目錄遍歷攻擊，防止解壓縮時覆蓋伺服器關鍵系統檔案。
