PHP如何防止POST重复提交?简单实现方法分享
- 云服务器
- 2026-02-14
- 3178
实现思路
- 在表单页面生成唯一Token并存储到Session
- 将Token作为隐藏字段添加到表单
- 提交时验证Token是否匹配
- 验证后立即销毁Session中的Token
代码示例
表单页面 (form.php)

处理页面 (submit.php)
<?php session_start(); // 检查是否POST提交 if ($_SERVER['REQUEST_METHOD'] !== 'POST') { die('无效请求'); } // 验证Token if (!isset($_POST['token']) || !isset($_SESSION['form_token']) || $_POST['token'] !== $_SESSION['form_token']) { die('表单已提交,请勿重复操作!'); } // 立即清除Token(关键步骤) unset($_SESSION['form_token']); // 处理业务数据(示例) $username = $_POST['username']; echo "用户 {$username} 注册成功!"; // 这里可以继续数据库操作等... ?>
关键点说明
-
Token生成
random_bytes() 生成加密安全的随机字节,bin2hex() 转换为可打印字符串

-
一次性验证
验证后立即 unset($_SESSION['form_token']),确保Token只能使用一次

-
错误处理
- 未提交Token
- Session中无Token
- Token不匹配
三种情况均会被拦截
-
补充安全措施
// 提交后重定向(防止刷新重复提交) header('Location: success_page.php'); exit; - 用户首次提交:正常处理
- 页面刷新/F5:提示”表单已提交”
- 浏览器回退后提交:提示”表单已提交”
- 多标签提交:每个标签有独立Token
实际效果
提示:对于网络延迟导致的多次点击,建议在前端添加按钮禁用逻辑(JS实现点击后禁用按钮),与Token机制形成双重防护。