实现思路
- 在表单页面生成唯一Token并存储到Session
- 将Token作为隐藏字段添加到表单
- 提交时验证Token是否匹配
- 验证后立即销毁Session中的Token
代码示例
表单页面 (form.php)

<?php
session_start();
// 生成随机Token(32字符)
$token = bin2hex(random_bytes(16));
$_SESSION['form_token'] = $token;
?>
<form method="post" action="submit.php">
<!-- 隐藏的Token字段 -->
<input type="hidden" name="token" value="<?php echo $token; ?>">
<input type="text" name="username" placeholder="用户名" required>
<input type="submit" value="提交">
</form>
处理页面 (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机制形成双重防护。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/295154.html

