php实现验证刷新
防止表单重复提交的方法
在PHP中实现验证刷新功能,主要是为了防止表单重复提交。以下是几种常见的方法:
使用Token验证
生成一个唯一的Token并存储在Session中,表单提交时验证Token是否匹配。
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
die('Invalid token');
}
// 处理表单数据
unset($_SESSION['token']);
} else {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
重定向后处理

处理完表单后立即重定向到另一个页面,避免刷新导致重复提交。
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 处理表单数据
header('Location: success.php');
exit;
}
使用HTTP缓存控制
设置响应头禁止缓存页面,防止后退导致表单重复提交。

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
验证码实现
添加验证码可以有效防止自动提交和刷新攻击。
session_start();
// 生成验证码
$code = rand(1000, 9999);
$_SESSION['captcha'] = $code;
// 验证验证码
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['captcha']) || $_POST['captcha'] != $_SESSION['captcha']) {
die('验证码错误');
}
// 处理表单数据
unset($_SESSION['captcha']);
}
数据库记录验证
对于重要操作,可以在数据库中记录请求状态。
// 提交时检查是否已存在相同记录
$stmt = $pdo->prepare("SELECT COUNT(*) FROM submissions WHERE user_id = ? AND operation = ?");
$stmt->execute([$user_id, $operation]);
if ($stmt->fetchColumn() > 0) {
die('该操作已提交,请勿重复操作');
}
// 处理并记录到数据库
前端限制
结合JavaScript禁用提交按钮,防止多次点击。
document.querySelector('form').addEventListener('submit', function() {
this.querySelector('button[type="submit"]').disabled = true;
});
以上方法可以单独使用或组合使用,根据具体场景选择最适合的方案。对于安全性要求高的场景,建议同时使用后端Token验证和数据库记录验证。






