安全 · Security

最後更新 · Last updated: 2026-05-09

加密儲存 · Encrypted at rest — Supabase 磁碟級 AES-256 加密

Singapore-hosted — 主要 database + storage 駐留新加坡 ap-southeast-1

錄音自動刪除 · Audio auto-deleted — 語音檔案在轉錄完成後即時 purge

你簽署方為 final · You sign to finalise — AI 草稿須 practitioner 親自審閱 + 簽名方 lock

1. 傳輸層加密1. Transport encryption

所有 traffic(browser ↔ Vercel ↔ Supabase ↔ AI providers)強制 HTTPS / TLS 1.2+。 HSTS preload header 啟用;HTTP downgrade 由 edge layer 自動 redirect 至 HTTPS。

2. 儲存層加密2. Storage encryption

  • Database:PostgreSQL on Supabase,underlying volume AES-256 加密
  • Object storage(logo / payment screenshot / SOAP audio buffer / InBody scan):Supabase Storage AES-256 加密 + 私人 bucket 預設禁止公開
  • Secrets(Supabase service role key、Anthropic API key、Resend API key 等):僅儲存於 Vercel 環境變數,不會 commit 入 git
  • 密碼:以 bcrypt 加 salt hash,不以明文儲存或記錄;Supabase Auth 處理

3. Row-Level Security (RLS)3. Row-Level Security

所有 PracticeFlow 的 multi-tenant table 都啟用 PostgreSQL row-level security policies — 每張 table 有 4 條 policy(select / insert / update / delete), 根據 workspace_id match user 的 owned workspaces 才放行。即使應用層 code 有 bug,DB 也不會洩露其他 workspace 的資料。Service-role key(可繞過 RLS)僅伺服器端使用,不會 expose 給任何 client bundle。

4. 語音錄音處理4. Voice recording handling

所有 audio file 在轉錄完成後即時刪除 — 我們不會持久儲存。 流程:

  1. Practitioner 在 client 同意後 record 一段語音
  2. 檔案 upload 至 Supabase Storage(私人 bucket,僅 workspace owner 可讀)
  3. 後端 download → 傳給 transcription provider(OpenAI / Gladia)→ 取回文字
  4. 後端 best-effort delete 該 storage object(無論轉錄成敗)
  5. 轉錄文字儲存於 SOAP 紀錄;audio file 不再存在

此設計取代任何長期 audio 倉儲,將 audio leak 的 attack surface 縮減至「轉錄處理的數秒至數分鐘窗口」。

5. AI 草稿生成5. AI drafting

  • 所有 AI prompt 與 tool schema 在伺服器端載入(import "server-only")— 不會 bundle 落 client,避免 trade-secret 洩露
  • 傳給 Anthropic Claude 的內容只是**轉錄文字 + 結構化輸入(MCQ / ROM / 等)**,不包 audio file
  • Anthropic 不會用 PracticeFlow 的 API 流量訓練 model(per Anthropic Terms — Commercial API 默認 opt-out)
  • 每次 generation stamp prompt_version + ai_model 入 row,便於 audit + 回放
  • 所有 AI 草稿須由 practitioner 審閱 + 簽署才 lock 為 final — AI 不可以單獨 finalise 紀錄

6. 客戶 Portal 認證6. Client portal access

Practitioner 透過 wa.me deep link 將 portal magic-link 寄給 client。Token 為 32-byte URL-safe random(256 bits entropy),30 日後自動失效,practitioner 隨時可 Regenerate 廢除舊 link。Portal 全部是 read-only — token 流出最多查看到自己一個 client 的紀錄,不會跨 client / 跨 workspace。

7. 帳戶認證 + 會話7. Authentication & sessions

  • Email + 密碼登入;密碼重設透過電郵 magic-link
  • JWT-based session,cookie 設定 HttpOnly + Secure + SameSite=Lax
  • 無第三方 OAuth(無 Google / Apple sign-in)— 減少 attack surface
  • 無 SMS OTP / 二步驗證於 MVP(roadmap:Phase 2 加 TOTP)

8. 客戶錄音同意 (Consent)8. Audio recording consent

每個 SOAP session 開始錄音前,practitioner 必須按「Client 已同意錄音 + AI 處理」的 consent gate。此舉動會將「Patient acknowledged and consented to audio recording for clinical documentation prior to session」自動寫入 SOAP Subjective section 第一句。Practitioner 不可以繞過這個 gate。

9. 資料備份9. Backups

Supabase 自動每日 snapshot 全部 database,保留 7 日(free tier)/ 30 日(paid tier)。Practitioner 隨時可透過 settings 的 export 功能下載自己 workspace 的資料快照(CSV / JSON)。

10. 監測 + 應變10. Monitoring & incident response

  • 錯誤監測:Sentry — 收 Stack trace 但不包敏感 PII
  • 使用分析:PostHog — 事件 + workspace level 統計,不追蹤個別 client
  • 異常登入:登入時間 / IP 紀錄,practitioner 可在 settings 查
  • 事件響應:發現任何疑似資料洩露事件,將會在 72 小時內以電郵通知受影響 practitioner,並向香港私隱專員公署報告(如達披露門檻)

11. 漏洞披露 (Responsible disclosure)11. Vulnerability disclosure

如閣下發現 PracticeFlow 任何安全漏洞,請以電郵通知 seanko88@gmail.com。我們會:

  • 72 小時內回覆確認
  • 盡快修補(critical issue 7 日內目標)
  • 修補後公開致謝(如閣下同意)

請勿主動測試其他 workspace 的資料 / DDoS / 社交工程攻擊員工。Bounty 計劃尚未開放。

12. 仍未完成的項目12. Known limitations

  • Two-factor authentication(TOTP / passkey)未支援 — Phase 2 會加
  • SOC 2 / ISO 27001 認證未取得 — pre-launch 階段,會隨業務規模考慮
  • Per-row encryption(field-level)未做 — 依靠 Supabase 磁碟級 + RLS 兩層保障
  • Workspace audit log UI 未上線 — 後端 audit_log table 已記錄敏感操作,UI 於 Phase 1.5

13. 聯絡13. Contact

一般安全查詢:
Sean Ko · seanko88@gmail.com