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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
PHP下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
PHP教程 变量定义
Oct 23 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
Mar 10 PHP
PHP类和对象相关系统函数与运算符小结
Sep 28 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
Nov 14 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
PHP基于递归实现的约瑟夫环算法示例
Aug 27 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
Mar 01 PHP
在 Laravel 中动态隐藏 API 字段的方法
Oct 25 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学习笔记汇总
2014/10/05 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
JS 树形递归实例代码
2010/05/18 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
node.js中的fs.appendFile方法使用说明
2014/12/17 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
JavaScript中Function详解
2015/02/27 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
2015/11/15 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
Vue.js组件使用开发实例教程
2016/11/01 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
基于复选框demo(分享)
2017/09/27 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
Python中的浮点数原理与运算分析
2017/10/12 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
一些PHP的面试题
2015/05/06 面试题
考试不及格检讨书
2014/01/09 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
2015年大学班主任工作总结
2015/04/30 职场文书
2016教师校本研修心得体会
2016/01/08 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
Java实现超大Excel文件解析(XSSF,SXSSF,easyExcel)
2022/07/15 Java/Android
华为HarmonyOS3.0强在哪? 看看鸿蒙3.0这7个小功能
2023/01/09 数码科技