表單重複提交是多使用者 Web 應用常見問題,來源包括:雙擊提交按鈕、重新整理頁面、瀏覽器前進/後退、歷史記錄重送、瀏覽器重複 HTTP 請求。
防禦方法
- 停用提交按鈕:提交後用 JavaScript 設
disabled。缺點:用戶停用 JS 則失效。
- Post/Redirect/Get (PRG) 模式:提交處理完成後導向成功頁面。可避免 F5 重送、前進/後退重送,且無瀏覽器警告。
- Session Token 驗證:表單載入時產生唯一 Token 存 Session 與隱藏欄位;提交時比對並移除 Session Token。若 Token 缺失或不符,拒絕處理。兼具 CSRF 防護。
- 資料庫唯一約束/索引:於資料表建立唯一鍵或索引,從資料層杜絕重複資料。最徹底有效。
建議採用 PRG 模式搭配 Session Token 多層防禦,關鍵業務再輔以資料庫約束,全方位解決重複提交風險。