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 14 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
解析PHP跨站刷票的实现代码
Jun 18 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
PHP实现的常规正则验证helper公共类完整实例
Apr 27 PHP
Laravel 实现密码重置功能
Feb 23 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 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 和 COM
2006/10/09 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
解析php获取字符串的编码格式的方法(函数)
2013/06/21 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
怎么清空javascript数组
2013/05/11 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
再探JavaScript作用域
2014/09/24 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
Angular中的interceptors拦截器
2017/06/25 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
vue中的过滤器实例代码详解
2019/06/06 Javascript
npm的lock机制解析
2019/06/20 Javascript
js实现旋转的星空效果
2019/11/01 Javascript
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python2和python3哪个使用率高
2020/06/23 Python
JupyterNotebook 输出窗口的显示效果调整实现
2020/09/22 Python
什么是Web Service?
2012/07/25 面试题
感恩节活动方案
2014/01/27 职场文书
物业管理工作方案
2014/05/10 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
党员反对四风问题思想汇报
2014/09/12 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
法人授权委托书样本
2014/09/19 职场文书
党的群众路线对照检查材料
2014/09/22 职场文书
工作检讨书范文
2015/01/23 职场文书
教师个人总结范文
2015/02/11 职场文书
学校通报表扬范文
2015/05/04 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
如何在Python中妥善使用进度条详解
2022/04/05 Python