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不用内置函数对数组排序的两个算法代码
Feb 08 PHP
一道求$b相对于$a的相对路径的php代码
Aug 08 PHP
php学习笔记(三)操作符与控制结构
Aug 06 PHP
浅析PHP Socket技术
Aug 02 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
php新浪微博登录接口用法实例
Dec 23 PHP
php获取本周星期一具体日期的方法
Apr 20 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
如何判断php mysqli扩展类是否开启
Dec 24 PHP
PHP+MYSQL实现读写分离简单实战
Mar 13 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP实现动态获取函数参数的方法示例
Apr 02 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
基于mysql的bbs设计(二)
2006/10/09 PHP
关于php循环跳出的问题
2013/07/01 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
2017/06/06 PHP
理清PHP在Linxu下执行时的文件权限方法
2017/06/07 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
Express的路由详解
2015/12/10 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
vue监听input标签的value值方法
2018/08/27 Javascript
vue的for循环使用方法
2019/02/12 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
vue中的mescroll搜索运用及各种填坑处理
2019/10/30 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
Python 字典中的所有方法及用法
2020/06/10 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
ONLY瑞典官网:世界知名服装品牌
2018/06/19 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
业务员岗位职责范本
2013/12/15 职场文书
运动会方阵解说词
2014/02/12 职场文书
《蚂蚁和蝈蝈》教学反思
2014/02/24 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
人事专员岗位职责
2015/02/03 职场文书
居住证明范文
2015/06/17 职场文书