已驗證結果與實際 SQL
ChatGPT 網頁版:已走通的實驗
Section titled “ChatGPT 網頁版:已走通的實驗”2026-10-20,以 sales.a 經專用私人 Tunnel,依序成功呼叫三個工具。後端同一 request ID 的紀錄與頁面結果相符:
| 項目 | 實際值 |
|---|---|
| request ID | f987dc2ce2965cb7 |
| 查詢基準日 | 2026-10-20 |
| 回傳 | 10 筆;has_more=true、next_offset=10 |
| 第一筆 | SO-2026-00633/虛構品牌客戶033/3,453 公尺 |
| 本頁剩餘量合計 | 36,848.40 公尺,並非全部符合條件訂單總量 |
| 後端實驗耗時 | 255ms,非 ChatGPT 回答總耗時 |
| 撤銷租約 | true |
| 舊連線終止 | true |
| 舊密碼重登遭拒 | true |
| 後端 AppRole Token 撤銷 | true |
本頁下方的 10 筆訂單與 SQL 同時經 Codex 與 ChatGPT 查詢對照一致。完整私人會話與日誌由講師保管;公開摘要不含憑證。

截圖為本次真實 ChatGPT 回應的一部分;畫面只包含合成訂單資料。
紀錄日期:2026-10-20。下列查詢是 Codex CLI 0.160.0 → MCP → OpenBao → PostgreSQL 的實際結果,另有上方獨立的 ChatGPT 網頁版驗收,兩次 request ID 不同。查詢固定使用合成資料的基準日。
| 驗收 | 已觀察結果 |
|---|---|
| 資料與權限 | 33 項通過,27 表/17,992 列 |
| SSO 邊界 | 18 項通過,並有真實瀏覽器登入驗收 |
| OpenBao | 正常/錯誤清理、主動撤銷、15 秒自然到期、重啟 sealed 拒絕 |
| MCP | 32 項通過:Token、角色、scope、輸入、分頁、查詢與清理 |
| Codex | 真實 OAuth 登入,依序完成 whoami、describe_business_data、query_orders |
| 備份 | pg_dump 還原到臨時庫,27 表列數比對一致 |
| Grafana | 13 個資料面板查詢成功 |
以下是實際回答摘錄;完整內部事件紀錄由講師保管,不包含在公開下載包。
已依序實際呼叫 whoami → describe_business_data → query_orders,查詢成功。後端標示資料為合成測試資料。
認證使用者:sales.a(角色:sales)。授權範圍:台灣市場訂單、業務唯讀;sales.a 與 sales.b 共用範圍,非逐客戶或逐學員隔離。
查詢條件:截至 2026-10-20 已逾期、剩餘未出貨量大於 0、排除取消訂單,依 oldest_due 排序,limit=10、offset=0。剩餘量包含截止日當天出貨的扣除。
| 訂單編號 | 客戶名稱 | 剩餘未出貨(公尺) |
|---|---|---|
| SO-2026-00633 | 虛構品牌客戶033 | 3,453.00 |
| SO-2026-00693 | 虛構品牌客戶033 | 8,673.00 |
| SO-2026-00621 | 虛構品牌客戶021 | 2,409.00 |
| SO-2026-00681 | 虛構品牌客戶021 | 7,629.00 |
| SO-2026-00741 | 虛構品牌客戶021 | 4,149.00 |
| SO-2026-00001 | 虛構品牌客戶001 | 669.00 |
| SO-2026-00645 | 虛構品牌客戶045 | 2,698.20 |
| SO-2026-00801 | 虛構品牌客戶021 | 669.00 |
| SO-2026-00705 | 虛構品牌客戶045 | 610.20 |
| SO-2026-00861 | 虛構品牌客戶021 | 5,889.00 |
request_id:a06e1f11749f02a6
分頁:回傳 10 筆,has_more=true、next_offset=10;這不是全部符合條件的訂單。
後端回報:租約撤銷 lease_revoked=true、既有連線終止 existing_connection_terminated=true、舊密碼重新登入遭拒 new_login_rejected=true。
實際回傳的參數化 SQL:
WITH shipped AS ( SELECT order_item_id, SUM(quantity_m) AS shipped_m FROM sales.shipments WHERE shipped_at <= %(as_of)s GROUP BY order_item_id), orders AS ( SELECT o.order_id, o.order_no, o.customer_id, c.company_name AS customer, c.market, o.order_date, o.promised_ship_date, o.status, %(as_of)s::date - o.promised_ship_date AS overdue_days, SUM(GREATEST(i.quantity_m - COALESCE(s.shipped_m, 0), 0)) AS remaining_quantity_m FROM sales.orders o JOIN crm.customers c ON c.customer_id = o.customer_id JOIN sales.order_items i ON i.order_id = o.order_id LEFT JOIN shipped s ON s.order_item_id = i.order_item_id WHERE o.order_date <= %(as_of)s AND o.status <> 'cancelled' AND o.promised_ship_date < %(as_of)s GROUP BY o.order_id, o.order_no, o.customer_id, c.company_name, c.market, o.order_date, o.promised_ship_date, o.status)SELECT * FROM ordersWHERE remaining_quantity_m > 0ORDER BY promised_ship_date ASC, order_id ASCLIMIT %(fetch_limit)s OFFSET %(offset)sSQL 綁定參數:as_of='2026-10-20'、fetch_limit=11、offset=0;多取一筆用於判斷是否有下一頁。
證據不代表什麼
Section titled “證據不代表什麼”這些測試不能證明所有攻擊都被阻擋,也不等於 50 人壓力測試。sales.a 與 sales.b 共用市場範圍;未驗證逐學員隔離。自然語言正確率也不是僅測一道題就完成,需要固定題庫與回饋。