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仿discuz分页效果代码
Oct 02 PHP
用php随机生成福彩双色球号码的2种方法
Feb 04 PHP
解析php中两种缩放图片的函数,为图片添加水印
Jun 14 PHP
php抽奖小程序的实现代码
Jun 18 PHP
改写函数实现PHP二维/三维数组转字符串
Sep 13 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
Sep 21 PHP
php获取'/'传参的值简单方法
Jul 13 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
tp5框架基于ajax实现异步删除图片的方法示例
Feb 10 PHP
Laravel如何实现适合Api的异常处理响应格式
Jun 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
新闻分类录入、显示系统
2006/10/09 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
php 判断网页是否是utf8编码的方法
2014/06/06 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
各种常用浏览器getBoundingClientRect的解析
2009/05/21 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
js调试工具Console命令详解
2014/10/21 Javascript
JS实现淡蓝色简洁竖向Tab点击切换效果
2015/10/06 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
Bootstrap每天必学之按钮(Button)插件
2016/04/25 Javascript
Nodejs进阶:express+session实现简易登录身份认证
2017/04/24 NodeJs
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
详解使用WebPack搭建React开发环境
2019/08/06 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
Vue实现手机扫描二维码预览页面效果
2020/05/28 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
python里对list中的整数求平均并排序
2014/09/12 Python
Python中使用logging模块打印log日志详解
2015/04/05 Python
Python中对元组和列表按条件进行排序的方法示例
2015/11/10 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
基于python监控程序是否关闭
2020/01/14 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
Python实现自动访问网页的例子
2020/02/21 Python
Python机器学习工具scikit-learn的使用笔记
2021/01/28 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
Java中实现多态的机制是什么?
2014/12/07 面试题
医学生个人求职信范文
2014/02/07 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python