表單重複提交會導致資料重複寫入、扣款多次等嚴重問題。本文示範以 Session 結合 IP 與表單參數生成唯一標識,限制同一用戶在指定時間內無法重複請求同一業務邏輯。
session_start();
$fs1 = $_POST['a'];
$fs2 = $_POST['b'];
$allowTime = 30; // 秒
$reip = GetIP(); // 取得真實 IP
$allowT = md5($reip . $fs1 . $fs2);
if (!isset($_SESSION[$allowT])) {
$_SESSION[$allowT] = time();
} elseif (time() - $_SESSION[$allowT] >= $allowTime) {
$_SESSION[$allowT] = time();
} else {
header('HTTP/1.1 404 Not Found');
die('來自 ' . $ip . ' 的用戶,您刷新過快了');
}
md5(IP + 表單參數) 區分不同業務提交,避免同一 IP 不同表單互相干擾。$allowTime 秒直接拒絕。HTTP_X_FORWARDED_FOR、HTTP_CLIENT_IP 等多層代理環境。<form action="b.php" method="post">
<input type="hidden" name="a" value="a"/>
<input type="hidden" name="b" value="b"/>
<button type="submit">提交</button>
</form>
Referer 檢查防範跨站提交(CSRF),但需注意瀏覽器兼容性。SETNX key EX 30 替代 Session,避免檔案鎖競爭。