安全 · 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 在轉錄完成後即時刪除 — 我們不會持久儲存。 流程:
- Practitioner 在 client 同意後 record 一段語音
- 檔案 upload 至 Supabase Storage(私人 bucket,僅 workspace owner 可讀)
- 後端 download → 傳給 transcription provider(OpenAI / Gladia)→ 取回文字
- 後端 best-effort delete 該 storage object(無論轉錄成敗)
- 轉錄文字儲存於 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