php实现验证刷新
防止重复提交与CSRF防护
在PHP中实现表单提交的验证和防止重复刷新,通常需要结合Token机制和会话管理。以下是一个常见的方法:
生成Token并存储到Session
session_start();
$token = bin2hex(random_bytes(32));
$_SESSION['form_token'] = $token;
在表单中嵌入Token
<form method="post">
<input type="hidden" name="token" value="<?php echo $token; ?>">
<!-- 其他表单字段 -->
</form>
验证Token并处理提交
处理表单提交时验证Token有效性,验证后立即清除Session中的Token:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['form_token']) {
die('无效的Token或重复提交');
}
// 处理有效提交
unset($_SESSION['form_token']); // 立即清除Token
}
重定向防止刷新重复提交
处理完POST请求后,使用PRG模式(Post-Redirect-Get)避免刷新导致的重复提交:
header('Location: '.$_SERVER['PHP_SELF']);
exit;
完整实现示例
session_start();
// 生成Token
if (empty($_SESSION['form_token'])) {
$_SESSION['form_token'] = bin2hex(random_bytes(32));
}
// 处理提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!hash_equals($_SESSION['form_token'], $_POST['token'] ?? '')) {
die('安全验证失败');
}
// 业务处理代码...
unset($_SESSION['form_token']);
header('Location: '.$_SERVER['PHP_SELF']);
exit;
}
<!-- 表单部分 -->
<form method="post">
<input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['form_token']); ?>">
<input type="submit" value="提交">
</form>
增强安全性建议
使用hash_equals()而不是普通比较来防止时序攻击
设置Token有效期,例如10分钟后过期
对于重要操作可要求二次验证
结合IP限制或用户行为分析
这种方法能有效防止:
- 重复表单提交
- CSRF跨站请求伪造
- 刷新导致的重复操作







