Onyx Secret logo
Onyx Secret Open Review
返回主頁
公開審查摘要

系統架構 - 安全研究人員審查 (Open Review)

本頁是整理系統之設計承諾及公開審查摘要,供讀者了解系統架構與實踐現況。

文件中將提供 Onyx Secret 部分後端系統架構、認證流程、主要 API 路由及行為規則等核心設計決策,供安全研究人員及一般用戶參考。歡迎提出建議與改進意見。基於安全考量,我們不會公開真實後端的完整原始碼。

1. 認證流程

`/api/auth/otp`:發送一次性驗證碼

以 `sid` 生成匿名學校電郵格式,並使用 KV 做 60 秒限流與 5 分鐘 OTP 保存。

await env.KV.put(`OTP:${email}`, otp, { expirationTtl: 300 });

`/api/auth/verify`:驗證 OTP 並建立 session

驗證成功後刪除 OTP、建立 `users` 記錄、再把 `SESSION:*` 存入 KV,cookie 使用 `HttpOnly`、`Secure`、`SameSite=Strict`。

const sessionToken = crypto.randomUUID();
await env.KV.put(`SESSION:${sessionToken}`, hashId, { expirationTtl: 604800 });

`/api/auth/password`、`/api/auth/setup`、`/api/auth/tac`

密碼登入、首次設定 username/password、以及條款確認都以相同的 session 檢查運作。

`/api/me`:登入狀態查詢

未登入回傳 `loggedIn: false`;已登入則回傳匿名 mask,供前端顯示狀態。

2. 主要 API 路由

Posts / Comments

  • `GET /api/posts`:載入 feed,合併留言並套用 cache。
  • `POST /api/posts`:新增帖子並清理 `FEED_CACHE_1`。
  • `POST /api/comments`:新增留言並清理 feed cache。
  • `DELETE /api/posts/:id`:作者可刪除自己的帖子。

Action / Voting

  • `POST /api/action`:記錄 `UPVOTE`、`DOWNVOTE` 或 `REPORT`。
  • 動作後會更新帖子或留言計數。
  • 每次操作都會清理 feed cache。
3. 行為規則

匿名化資料模型

使用者以 `hash_id` 作為主鍵;顯示時只露出前 8 碼 mask。電郵與密碼都經 `hashData()` + salt 處理。

Burnable post 顯示邏輯

`is_burnable` 文章在發布 24 小時後於 API 層直接隱藏,不再回傳內容。

const isBurned = post.is_burnable && (Date.now() - new Date(post.created_at).getTime() > 86400000);