当前位置:首页 > 云服务器 > 正文

PHP如何防止POST重复提交?简单实现方法分享

实现思路

  1. 在表单页面生成唯一Token并存储到Session
  2. 将Token作为隐藏字段添加到表单
  3. 提交时验证Token是否匹配
  4. 验证后立即销毁Session中的Token

代码示例

表单页面 (form.php)

PHP如何防止POST重复提交?简单实现方法分享 第1张

处理页面 (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} 注册成功!"; // 这里可以继续数据库操作等... ?>

关键点说明

  1. Token生成

    random_bytes() 生成加密安全的随机字节,bin2hex() 转换为可打印字符串

    PHP如何防止POST重复提交?简单实现方法分享 第2张

  2. 一次性验证

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

    PHP如何防止POST重复提交?简单实现方法分享 第3张

  3. 错误处理

    • 未提交Token
    • Session中无Token
    • Token不匹配

      三种情况均会被拦截

    • 补充安全措施

      // 提交后重定向(防止刷新重复提交) header('Location: success_page.php'); exit;
    • 实际效果

      • 用户首次提交:正常处理
      • 页面刷新/F5:提示”表单已提交”
      • 浏览器回退后提交:提示”表单已提交”
      • 多标签提交:每个标签有独立Token

      提示:对于网络延迟导致的多次点击,建议在前端添加按钮禁用逻辑(JS实现点击后禁用按钮),与Token机制形成双重防护。

0