php防止用户重复提交表单


Posted in PHP onNovember 02, 2015

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。

效果图:

php防止用户重复提交表单

php防止用户重复提交表单 

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手:

首先从前端做限制。前端JavaScript在按钮被点击一次后禁用,即disabled,这个方法简单的防止了多次点击提交按钮,但是缺点是如果用户禁用了javascript脚本则失效。

第二,我们可以在提交后做redirect页面重定向,即提交后跳转到新的页面,主要避免F5重复提交,但是也有不足之处。

第三,就是数据库做唯一索引约束

第四,就是做session令牌验证
我们现在来了解下简单的利用session token来防止表单重复提交的方法。
我们在表单中加一个input隐藏域,即type="hidden",其value值用来保存token值,当页面刷新的时候这个token值会变化,提交后判断token值是否正确,如果前台提交的token与后台不匹配,则认为是重复提交。

<?php 
/* 
* PHP简单利用token防止表单重复提交 
*/ 
session_start(); 
header("Content-Type: text/html;charset=utf-8"); 
function set_token() { 
 $_SESSION['token'] = md5(microtime(true)); 
} 
 
function valid_token() { 
 $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false; 
 set_token(); 
 return $return; 
} 
 
//如果token为空则生成一个token 
if(!isset($_SESSION['token']) || $_SESSION['token']=='') { 
 set_token(); 
} 
 
if(isset($_POST['web'])){ 
 if(!valid_token()){ 
 echo "token error,请不要重复提交!"; 
 }else{ 
 echo '成功提交,Value:'.$_POST['web']; 
 } 
}else{ 
?> 
 <form method="post" action=""> 
 <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>"> 
 <input type="text" class="input" name="web" value="3water.com"> 
 <input type="submit" class="btn" value="提交" /> 
 </form> 
<?php 
} 
?>

以上是一个简单的防止重复提交表单的例子。

那么实际项目开发中,会对表单token做更复杂的处理,即我们说的令牌验证。可能要做的处理有:验证来源域,即来路,是否为外部提交;匹配要执行的动作,是添加、修改or删除;其次最重要的是构建token,token可以采用可逆的加密算法,尽可能复杂,因为明文还是不安全的。

以上就是为大家分享的如何解决ph防止用户重复提交表单问题,希望对大家的学习有所帮助。

PHP 相关文章推荐
php语言流程控制中的主动与被动
Nov 05 PHP
php实现utf-8和GB2312编码相互转换函数代码
Feb 07 PHP
基于PHP常用函数的用法详解
May 10 PHP
PHP遍历某个目录下的所有文件和子文件夹的实现代码
Jun 28 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
php下载远程大文件(获取远程文件大小)的实例
Jun 17 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
Apr 23 PHP
浅析PHP7 的垃圾回收机制
Sep 06 PHP
laravel框架中路由设置,路由参数和路由命名实例分析
Nov 23 PHP
windows8.1下Apache+Php+MySQL配置步骤
Oct 30 #PHP
php验证邮箱和ip地址最简单方法汇总
Oct 30 #PHP
php三种实现多线程类似的方法
Oct 30 #PHP
php搜索文件程序分享
Oct 30 #PHP
纯php生成随机密码
Oct 30 #PHP
php利用smtp类实现电子邮件发送
Oct 30 #PHP
PHP利用APC模块实现大文件上传进度条的方法
Oct 29 #PHP
You might like
php输入数据统一类实例
2015/02/23 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
许愿墙中用到的函数
2006/10/07 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
javascript 动态创建表格
2015/01/08 Javascript
JQuery radio(单选按钮)操作方法汇总
2015/04/15 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
使用javascript插入样式
2016/03/14 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
jquery validate表单验证插件
2016/09/06 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
Node.js 使用axios读写influxDB的方法示例
2018/10/26 Javascript
[59:42]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
解决Python3.5+OpenCV3.2读取图像的问题
2018/12/05 Python
python画柱状图--不同颜色并显示数值的方法
2018/12/13 Python
Python实现数据结构线性链表(单链表)算法示例
2019/05/04 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
美国在线购买空气净化器、除湿器、加湿器网站:AllergyBuyersClub
2021/03/16 全球购物
Myprotein中国网站:欧洲畅销运动营养品牌
2021/02/11 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
师范学院毕业生求职信范文
2013/12/26 职场文书
幼儿园家长评语
2014/02/10 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
python内置模块之上下文管理contextlib
2022/06/14 Python