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 相关文章推荐
用windows下编译过的eAccelerator for PHP 5.1.6实现php加速的使用方法
Sep 30 PHP
PHP中读写文件实现代码
Oct 20 PHP
Yii中render和renderPartial的区别
Sep 03 PHP
php使用date和strtotime函数输出指定日期的方法
Nov 14 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
PHP使用pear自带的mail类库发邮件的方法
Jul 08 PHP
两款万能的php分页类
Nov 12 PHP
php使用正则验证中文
Apr 06 PHP
详解PHP序列化和反序列化原理
Jan 15 PHP
关于ThinkPHP中的异常处理详解
May 11 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 PHP
PHP数组Key强制类型转换实现原理解析
Sep 01 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
综合图片计数器
2006/10/09 PHP
PHP中英混合字符串截取函数代码
2011/07/17 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
浅析PHP中的i++与++i的区别及效率
2016/06/15 PHP
JavaScript的目的分析
2007/01/05 Javascript
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
jQuery 属性选择器element[herf*='value']使用示例
2013/10/20 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
javascript使用输出语句实现网页特效代码
2015/08/06 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
浅谈js函数的多种定义方法与区别
2016/11/29 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
详解javascript 正则表达式之分组与前瞻匹配
2018/05/30 Javascript
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
Vue多环境代理配置方法思路详解
2019/06/21 Javascript
three.js 如何制作魔方
2020/07/31 Javascript
[56:18]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
Python 获取当前所在目录的方法详解
2017/08/02 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
详解django中使用定时任务的方法
2018/09/27 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
Python中的集合介绍
2019/01/28 Python
python 随机森林算法及其优化详解
2019/07/11 Python
Python学习笔记之For循环用法详解
2019/08/14 Python
对Keras中predict()方法和predict_classes()方法的区别说明
2020/06/09 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
比较基础的php面试题及答案-编程题
2012/10/14 面试题
职业规划书如何设计?
2014/01/09 职场文书
幸福中国演讲稿
2014/09/12 职场文书