PHP利用Token机制防止表单重复提交的实现方法

今天早睡
今天早睡
发布时间:2026-10-13 | 1人浏览过
原创

在Web开发中,防止表单重复提交是保障数据一致性的重要环节。本文将通过具体的PHP代码示例,演示如何利用Session和MD5哈希值构建一套简单的Token验证机制,确保每个表单操作仅被服务器接受一次。

防止重复提交的核心原理

表单重复提交通常由网络延迟、用户双击或浏览器刷新引起。解决思路遵循“单例”原则:每次加载表单页面时生成一个唯一的随机Token并存储在服务器端(如Session);当用户提交表单时,将前端携带的Token与服务器端存储的Token进行比对。若一致则视为合法请求,并随即销毁或更新当前的Token,使得再次提交旧的Token失效。

准备条件与功能说明

  • 运行环境:支持PHP的Web服务器(如Nginx/Apache)。
  • 依赖基础:需开启并正常使用session会话管理。
  • 目标效果:实现set_token()生成新令牌,valid_token()校验令牌并重置。

真实操作顺序

第1步:初始化Session并定义工具函数

首先启动Session会话,然后编写两个核心函数:set_token()用于生成新的Token存入$_SESSION['token'],valid_token()负责比对请求中的Token是否为当前有效的那个,并在校验通过后生成一个新的Token以备下次使用。

<?php
// 启动会话,必须在任何输出之前调用
session_start();

/**
 * 生成新的Token并存入Session
 */
function set_token() {
    $_SESSION['token'] = md5(microtime(true));
}

/**
 * 验证Token:对比传入Token与Session中的Token
 * 若一致则验证通过,并生成新Token
 */
function valid_token() {
    // 判断请求中的数据是否为当前Session保留的Token
    $return = ($_REQUEST['token'] === $_SESSION['token']) ? true : false;
    
    // 无论是否验证成功,立即刷新Token以防重放攻击
    set_token();
    
    return $return;
}

第2步:检查Session状态并初始化

为了避免Session变量未定义的警告,在页面加载初期需要检查$_SESSION['token']是否存在。如果为空或未设置,则调用set_token()创建初始Token。

// 如果token不存在或为空,则生成一个token
if(!isset($_SESSION['token']) || $_SESSION['token']=='') {
    set_token();
}

第3步:构建HTML表单与接收处理逻辑

在前端表单中,必须包含一个隐藏域<input type="hidden" name="token" ...>,其值动态输出为当前Session中的Token。后端处理逻辑中,检测是否有POST请求,并调用valid_token()进行拦截。

<form method="post" action="">
  <!-- 将Session中的Token传递给表单 -->
  <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">
  
  <!-- 普通输入框示例 -->
  <input type="text" name="test" value="Default">
  
  <input type="submit" value="提交" />
</form>

对应后端的接收处理代码如下:

if(isset($_POST['test'])){
    // 执行验证逻辑
    if(!valid_token()){
        echo "token error";
    }else{
        echo '成功提交,Value:'.$_POST['test'];
    }
}

完成判断

当表单正常提交一次后,控制台输出“成功提交”,且再次刷新页面或点击提交按钮时,由于旧Token已被替换,后台会抛出“token error”,从而达成防止重复提交的目的。

简要总结

该方案利用服务端Session保持状态,通过一次性Token实现了基础的防重放攻击。需要注意的是,此示例代码侧重于教学演示,实际生产环境中建议加入更严格的CSRF防御机制、速率限制以及针对敏感操作的二次确认流程。 以上就是PHP使用Token防止表单重复提交的详细内容,更多关于PHP表单安全的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表