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 相关文章推荐
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
PHP ajax 分页类代码
Nov 13 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
PHP对MongoDB[NoSQL]数据库的操作
Mar 01 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
php通过隐藏表单控件获取到前两个页面的url
Sep 09 PHP
解决ThinkPHP关闭调试模式时报错的问题汇总
Apr 22 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
PHP 无限级分类
May 04 PHP
PHP中的函数声明与使用详解
May 27 PHP
php转换上传word文件为PDF的方法【基于COM组件】
Jun 10 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 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
MySql中正则表达式的使用方法描述
2008/07/30 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
Laravel中基于Artisan View扩展包创建及删除应用视图文件的方法
2016/10/08 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
JQuery的Ajax跨域请求原理概述及实例
2013/04/26 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
jQuery插件bxSlider实现响应式焦点图
2015/04/12 Javascript
javascript删除数组重复元素的方法汇总
2015/06/24 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
vue接口请求加密实例
2020/08/11 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
Python闭包之返回函数的函数用法示例
2018/01/27 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
eclipse创建python项目步骤详解
2019/05/10 Python
详解Python中的测试工具
2019/06/09 Python
nginx搭建基于python的web环境的实现步骤
2020/01/03 Python
基于python实现地址和经纬度转换
2020/05/19 Python
数据库笔试题
2013/05/09 面试题
应届医学毕业生求职信分享
2013/12/02 职场文书
初一生物教学反思
2014/01/18 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
工作疏忽检讨书500字
2014/10/26 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
八年级英语教学计划
2015/01/23 职场文书
中秋节寄语2015
2015/03/24 职场文书
当幸福来敲门观后感
2015/06/01 职场文书