TP5自定义函数如何防重复

雨辰君_3519

雨辰君_3519

2026-09-14

637人浏览

原创

tp5防重复提交需token生成、传输、校验、销毁四环节闭环:须绑定业务上下文、严格校验非空与长度、用session('token', null)清除、配合prg模式、禁用缓存、前端用{__token__/}、数据库加唯一索引兜底。

tp5自定义函数如何防重复

TP5 自定义函数防重复提交,核心不是加个函数就完事,而是必须让 token 生成、传输、校验、销毁四个环节闭环,且每个环节都避开常见陷阱。

为什么自定义 creatToken() 和 checkToken() 容易失效

你贴出的代码里用 authcode() 拼接固定密钥 + md5 截取,本质是伪随机——mt_rand() 可被预测,md5($key . substr(md5($str),8,10)) 碰撞概率高,且没做空值防御。更关键的是:session('TOKEN') 是全局 key,多个表单共用就会互相覆盖;unset($_SESSION['TOKEN']) 在 ThinkPHP 里不生效,得用 session('TOKEN', null) 才真正清除。

  • 生成时没绑定业务上下文,登录页和支付页共用一个 TOKEN,第二个提交必然失败
  • 校验前没检查 $_POST['TOKEN'] 是否存在或为空,空字符串和 null 会通过 == 比对(PHP 类型松散)
  • 没配合 PRG 模式,校验通过后直接 $this->fetch() 渲染原页面,用户刷新就是二次 POST

checkToken() 必须加这三步校验

光比对 session 值远远不够。真实生产环境要防多标签、防缓存、防异常分支漏处理:

  • 先判断 input('post.TOKEN') 是否非空且长度合理(比如 32 位 hex),避免空值绕过
  • 再比对 session('TOKEN') 是否存在且不为空,防止 session 未写入或已过期
  • 比对通过后立刻执行 session('TOKEN', null),而不是 session('TOKEN', '') 或 unset()

示例片段:

Typeless
Typeless

Typeless是一款AI文本写作工具,AI语音输入工具,智能上下文润色。

下载
if (!input('post.TOKEN') || strlen(input('post.TOKEN')) !== 32) {
    $this->error('非法请求');
}
if (session('TOKEN') !== input('post.TOKEN')) {
    $this->error('重复提交或表单已失效');
}
session('TOKEN', null); // 关键:清空,不是设空字符串

前端表单必须配合 Cache-Control 和 {__token__/} 替换

ThinkPHP 的 {__token__/} 标签依赖 'validate_token' => true 配置,但默认缓存头是 Cache-Control: private,导致用户点浏览器后退时加载的是旧页面,{__token__/} 还是上一次的值,而 session 里已经清空——必报错。

  • 控制器方法开头手动加 header('Cache-Control: no-cache, no-store, must-revalidate');
  • 不要手写 <input name="TOKEN" value="{:session('TOKEN')}">,改用 {__token__/},它会自动适配配置项和 session 驱动
  • 如果用了 Redis 存 session,确认 session('TOKEN') 写入和读取走的是同一实例(注意 Redis DB 切换)

数据库层唯一约束是最后防线,不能省

哪怕 token、PRG、按钮禁用全做了,仍可能因网络超时重发、MQ 重投等场景漏掉。订单号、支付流水号、用户操作日志的业务主键,必须加数据库唯一索引。

  • 例如订单表加 UNIQUE KEY `uniq_order_no` (`order_no`)
  • 后端捕获 IntegrityException 或 MySQL 错误码 1062,返回「操作已处理,请勿重复提交」
  • 别指望 PHP 层 try-catch 兜底所有并发冲突,索引才是原子性保障

真正难的不是写几个函数,而是把 session 生命周期、HTTP 缓存、前端交互、数据库约束这几条线拧成一股绳。任意一环松动,重复提交就会从缝隙里钻出来。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

2026.10.08

0

20

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

80

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

100

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

300

15

Buffalo框架路由与请求处理实操指南
Buffalo框架路由与请求处理实操指南

本专题讲解Buffalo框架路由与请求处理机制,涵盖路由注册与分组、资源路由、Handler编写规范、Context上下文方法、参数绑定、中间件编写挂载、Session与Cookie读写、Flash消息及错误页面定制方法。

2026.09.23

180

15

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

2026.09.23

140

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习