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动态变静态原理
Nov 25 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
PHP下操作Linux消息队列完成进程间通信的方法
Jul 24 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
PHP获取MySql新增记录ID值的3种方法
Jun 24 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
php+Mysqli利用事务处理转账问题实例
Feb 11 PHP
CentOS安装php v8js教程
Feb 26 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
php设计模式之单例模式代码
Jun 11 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 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的yii2框架中整合hbase库的方法
2018/09/20 PHP
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
nodejs中使用monk访问mongodb
2014/07/06 NodeJs
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
jQuery事件绑定on()、bind()与delegate() 方法详解
2015/06/03 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
Angular的$http的ajax的请求操作(推荐)
2017/01/10 Javascript
Javascript中document.referrer隐藏来源的方法
2017/01/16 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
2018/12/13 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python实现爬取知乎神回复简单爬虫代码分享
2015/01/04 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
Python实现全排列的打印
2018/08/18 Python
Python父目录、子目录的相互调用方法
2019/02/16 Python
pandas.cut具体使用总结
2019/06/24 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
np.dot()函数的用法详解
2020/01/17 Python
浅析Python requests 模块
2020/10/09 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
财产分割协议书范本
2014/11/03 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
工作保证书
2015/01/17 职场文书
幼儿园新学期开学寄语
2015/05/27 职场文书
如何开发一个渐进式Web应用程序PWA
2021/05/10 Javascript
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python