使用者重複點擊提交按鈕、瀏覽器重新整理、後退鍵操作,都會導致表單重複提交,造成資料重複寫入、扣款重複等嚴重問題。
利用 Session 儲存唯一 Token,表單攜帶 Token 提交,伺服器驗證後立即失效,實現「一次提交、一次驗證」:
session_start(); $token = mt_rand(0, 1000000); $_SESSION['token'] = $token;
<input type="hidden" name="token" value="<?php echo $token; ?>" />
if (isset($_POST['token'])) {
if ($_SESSION['token'] !== $_POST['token']) {
// 重複提交:Token 不符或已失效
die('請勿重複提交');
}
// 正常提交:處理業務邏輯
// 處理完成後立即重新產生 Token 或清除
$_SESSION['token'] = mt_rand(0, 1000000);
}
針對惡意重複提交,可結合 IP 記錄:
session_start();
if (empty($_SESSION['submit_ip'])) {
$_SESSION['submit_ip'] = $_SERVER['REMOTE_ADDR'];
// 執行寫入資料庫等核心邏輯
} else {
echo '偵測到重複提交,請勿重新整理或後退';
}
disabled 防止重複點擊random_bytes() 或 bin2hex(random_bytes(16)))完善的重複提交防護需要前後端配合,以伺服器端 Token 機制為核心,輔以資料庫冪等設計,才能構建可靠的系統。