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中全面阻止SQL注入式攻击分析小结
Jan 30 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
Jun 21 PHP
php fsockopen解决办法 php实现多线程
Jan 20 PHP
PHP模板引擎Smarty的缓存使用总结
Apr 24 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
Jan 03 PHP
Yii实现简单分页的方法
Apr 29 PHP
Yii框架组件和事件行为管理详解
May 20 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 PHP
PHP按符号截取字符串的指定部分的实现方法
Sep 10 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 5.0创建图形的巧妙方法
2010/10/12 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
不安全的常用的js写法
2009/09/15 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
javascript制作游戏开发碰撞检测的封装代码
2015/03/31 Javascript
js同源策略详解
2015/05/21 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
简单介绍Python中的struct模块
2015/04/28 Python
Python字符串处理之count()方法的使用
2015/05/18 Python
在Python中使用正则表达式的方法
2015/08/13 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
python使用TensorFlow进行图像处理的方法
2018/02/28 Python
Python实现的简单计算器功能详解
2018/08/25 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
python对文件的操作方法汇总
2020/02/28 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
2014村书记党建工作汇报材料
2014/11/02 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
2015年市场部工作总结
2015/04/30 职场文书