安全原則
金流程式的安全,核心是:卡號不要經過你、金額不要信前端、事件不要信未驗證的 POST。
PCI 合規:不要碰卡號
使用 Checkout 或 Payment Element 時,卡號在 Stripe 的 iframe 裡直接送到 Stripe。你的伺服器只會看到 pm_... 這類代號。
不要自己做 <input> 收完整卡號再 POST 到 Flask。那樣會讓你落入嚴格的 PCI 範圍,一般網站不該走這條路。
金鑰
- Secret key 只出現在伺服器環境變數或密鑰管理服務。
- 不要提交
.env。本站.gitignore已忽略.env。 - 前端只用 publishable key。
- 測試與正式金鑰分開;CI 與正式機用不同值。
金額與庫存
在建立 Session / PaymentIntent 之前,用伺服器資料算出 amount。建立之後顧客改前端也改不了這筆 Intent 的金額。
若使用 Dashboard 的 Price ID,把 price_... 寫在伺服器,不要讓瀏覽器指定任意 Price ID 除非你有白名單。
Webhook 簽章
任何人都能對你的 /webhook 發 JSON,假裝付款成功。必須用 endpoint secret 驗證:
驗證失敗就回 400,不要出貨。詳見 Webhook 履約。
HTTPS 與上線
正式環境全站 HTTPS。Webhook URL 必須是公開 HTTPS。本機用 Stripe CLI 轉送,不必把測試機暴露到網路上。
冪等
Stripe 可能重送同一個 Event。用 event.id 記到資料庫,處理過就跳過,避免出貨兩次。建立 Session 時也可帶 idempotency_key,避免網路重試建立兩筆付款。