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快速url重写 更新版[需php 5.30以上]
Apr 20 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
Jan 04 PHP
PHP 错误处理机制
Jul 06 PHP
PHP开发中AJAX技术的简单应用
Dec 11 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
Sep 11 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
Nov 25 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 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
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
使用php将某个目录下面的所有文件罗列出来的方法详解
2013/06/21 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
php基础教程
2015/08/26 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
PHP session 会话处理函数
2016/06/06 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
laravel 模型查询按照whereIn排序的示例
2019/10/16 PHP
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
javascript读写XML实现广告轮换(兼容IE、FF)
2013/08/09 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
微信小程序如何调用新闻接口实现列表循环
2019/07/02 Javascript
Vue获取页面元素的相对位置的方法示例
2020/02/05 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
python re正则表达式模块(Regular Expression)
2014/07/16 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
100行python代码实现跳一跳辅助程序
2018/01/15 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Sanic框架流式传输操作示例
2018/07/18 Python
Python使用pymongo模块操作MongoDB的方法示例
2018/07/20 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python小程序基于Jupyter实现天气查询的方法
2020/03/27 Python
Python操作Excel的学习笔记
2021/02/18 Python
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
企划经理的岗位职责
2013/11/17 职场文书
工地安全检查制度
2014/02/04 职场文书
还款承诺书范文
2014/05/20 职场文书
医德医魂心得体会
2014/09/11 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
Nginx配置并兼容HTTP实现代码解析
2021/03/31 Servers