首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 防止表單重複提交:Token 驗證與 Session 機制完整實作指南

     編輯:PHP 綜合知識

重複提交的危害與成因

使用者重複點擊提交按鈕、瀏覽器重新整理、後退鍵操作,都會導致表單重複提交,造成資料重複寫入、扣款重複等嚴重問題。

核心原理:一次性 Token 機制

利用 Session 儲存唯一 Token,表單攜帶 Token 提交,伺服器驗證後立即失效,實現「一次提交、一次驗證」:

步驟一:啟動 Session 並產生 Token

session_start();
$token = mt_rand(0, 1000000);
$_SESSION['token'] = $token;

步驟二:表單內嵌 Hidden Token 欄位

<input type="hidden" name="token" value="<?php echo $token; ?>" />

步驟三:提交時驗證並消耗 Token

if (isset($_POST['token'])) {
    if ($_SESSION['token'] !== $_POST['token']) {
        // 重複提交:Token 不符或已失效
        die('請勿重複提交');
    }
    // 正常提交:處理業務邏輯
    // 處理完成後立即重新產生 Token 或清除
    $_SESSION['token'] = mt_rand(0, 1000000);
}

進階方案:IP + Session 雙重防護

針對惡意重複提交,可結合 IP 記錄:

session_start();
if (empty($_SESSION['submit_ip'])) {
    $_SESSION['submit_ip'] = $_SERVER['REMOTE_ADDR'];
    // 執行寫入資料庫等核心邏輯
} else {
    echo '偵測到重複提交,請勿重新整理或後退';
}

前端輔助防禦(不可單獨依賴)

  • 提交後按鈕 disabled 防止重複點擊
  • 表單提交後跳轉至結果頁(PRG 模式:Post-Redirect-Get)
  • 使用 JavaScript 旗標阻擋多次提交事件

最佳實務總結

  1. 後端 Token 驗證為核心,前端僅為輔助
  2. Token 應具備不可預測性(使用 random_bytes() 或 bin2hex(random_bytes(16)))
  3. 驗證通過後立即失效或更新 Token
  4. 關鍵業務(付費、註冊)需資料庫層級冪等性設計(唯一索引、狀態機)
  5. 記錄提交日誌便於審計與問題追蹤

完善的重複提交防護需要前後端配合,以伺服器端 Token 機制為核心,輔以資料庫冪等設計,才能構建可靠的系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved