防止表单重复提交

mac2026-09-04  0

引言

表单重复提交是在多用户Web应用中最常见、带来很多麻烦的一个问题。有很多的应用场景都会遇到重复提交问题,比如:点击提交按钮两次。点击刷新按钮。使用浏览器后退按钮重复之前的操作,导致重复提交表单。

如何解决?

通过创建令牌,验证,销毁。来避免一个令牌,产出多次表单提交。

1.令牌函数

//创建TOKEN function create_token() { $code = chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)) . chr(mt_rand(0xB0, 0xF7)) . chr(mt_rand(0xA1, 0xFE)); // 加密 $token = md5("ADMIN" . substr(md5($code), 8, 10)); session('TOKEN', $token); } //判断TOKEN function check_token($token) { if ($token == session('TOKEN')) { session('TOKEN', NULL); return TRUE; } else { return FALSE; } }

2.在页面出现前,创建令牌

// 创建令牌,防止表单重复提交 create_token(); return $this->fetch();

3.在表单中,加入令牌,并赋值

<input type="hidden" name="TOKEN" value="{:session('TOKEN')}">

4.提交表单后验证令牌

if (request()->isPost()) { if (!check_token($_POST['TOKEN'])) { $this->redirect('LiveExtra/bannerList'); return; } if (input('?post.id')) { // 编辑 return "编辑"; } else { // 添加 return "添加"; } }

小结

通过唯一的令牌机制,可以避免表单重复提交的问题。如果数据很重要的时候,可以这样处理。

最新回复(0)