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算开始时间到过期时间的相隔的天数
Jan 12 PHP
Windows中使用计划任务自动执行PHP程序实例
May 09 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
PHP加密解密类实例分析
Apr 20 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
Symfony核心类概述
Mar 17 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
Sep 29 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
基于PHP实现微信小程序客服消息功能
Aug 12 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
Jan 26 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实现把数字ID转字母ID
2013/08/12 PHP
php生成扇形比例图实例
2013/11/06 PHP
php中fsockopen用法实例
2015/01/05 PHP
php按单词截取字符串的方法
2015/04/07 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
初学JavaScript_03(ExtJs Grid的简单使用)
2008/10/02 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
layui数据表格实现重载数据表格功能(搜索功能)
2019/07/27 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
详解Python中的循环语句的用法
2015/04/09 Python
使用Python &amp; Flask 实现RESTful Web API的实例
2017/09/19 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
Python3标准库总结
2019/02/19 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
Django怎么在admin后台注册数据库表
2020/11/14 Python
性能测试工程师的面试题
2015/02/20 面试题
英语专业个人求职信范文
2014/02/01 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
中学生检讨书1000字
2014/10/28 职场文书
员工工作表扬信
2015/05/05 职场文书
cf战队宣传语
2015/07/13 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
Vue router配置与使用分析讲解
2022/12/24 Vue.js