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加密解密的代码
Jul 16 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
php打造属于自己的MVC框架
Mar 07 PHP
php的declare控制符和ticks教程(附示例)
Mar 21 PHP
php计算给定时间之前的函数用法实例
Apr 03 PHP
php有效防止同一用户多次登录
Nov 19 PHP
twig里使用js变量的方法
Feb 05 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
PHP文件上传处理案例分析
Oct 15 PHP
PHP屏蔽关键字实现方法
Nov 17 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
详解PHP队列的实现
Mar 14 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
PHP4实际应用经验篇(1)
2006/10/09 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
页面版文本框智能提示JS代码
2009/11/20 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
javascript动态的改变IFrame的高度实现自动伸展
2013/10/12 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
AngularJS快速入门
2015/04/02 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
[59:30]完美世界DOTA2联赛PWL S3 access vs LBZS 第二场 12.20
2020/12/23 DOTA
python中的sort方法使用详解
2014/07/25 Python
10款最好的Web开发的 Python 框架
2015/03/18 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
2016/04/27 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
python得到windows自启动列表的方法
2018/10/14 Python
python 图像平移和旋转的实例
2019/01/10 Python
Python基本socket通信控制操作示例
2019/01/30 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
html5的canvas方法使用指南
2014/12/15 HTML / CSS
HTML5新特性之语义化标签
2017/10/31 HTML / CSS
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
正规的求职信范文分享
2013/12/11 职场文书
合同专员岗位职责
2013/12/18 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
居住证明范文
2015/06/17 职场文书
个人催款函范文
2015/06/23 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android