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 相关文章推荐
MySQL中create table语句的基本语法是
Jan 15 PHP
一个php导出oracle库的php代码
Apr 20 PHP
PHP 变量的定义方法
Jan 26 PHP
php XMLWriter类的简单示例代码(RSS输出)
Sep 30 PHP
解析PHP高效率写法(详解原因)
Jun 20 PHP
PHP同时连接多个mysql数据库示例代码
Mar 17 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
PHP连接MySQL数据的操作要点
Mar 20 PHP
PHP Opcache安装和配置方法介绍
May 28 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
Laravel 集成 Geetest验证码的方法
May 14 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
May 31 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 和 MySQL 基础教程(四)
2006/10/09 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
自写的jQuery异步加载数据添加事件
2014/05/15 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
vue axios用法教程详解
2017/07/23 Javascript
Webpack框架核心概念(知识点整理)
2017/12/22 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
详解如何使用nvm管理Node.js多版本
2019/05/06 Javascript
layui 弹出层回调获取弹出层数据的例子
2019/09/02 Javascript
JS实现长图上下滚动效果
2020/03/19 Javascript
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
python之DataFrame实现excel合并单元格
2021/02/22 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
Python测试模块doctest使用解析
2019/08/10 Python
python中使用np.delete()的实例方法
2021/02/01 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
护士自我鉴定
2013/10/23 职场文书
计算机维护专业推荐信
2014/02/27 职场文书
加多宝凉茶广告词
2014/03/18 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
航空学院求职信
2014/06/11 职场文书
公司股份合作协议书
2014/12/07 职场文书
骨干教师申报材料
2014/12/17 职场文书
公司考勤管理制度
2015/08/04 职场文书