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 远程关机操作的代码
Dec 05 PHP
php 购物车的例子
May 04 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
PHP中通过fopen()函数访问远程文件示例
Nov 18 PHP
php简单实现发送带附件的邮件
Jun 10 PHP
Zend Framework实现Zend_View集成Smarty模板系统的方法
Mar 05 PHP
PHP入门教程之图像处理技巧分析
Sep 11 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
PHP针对redis常用操作实例详解
Aug 17 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 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP 命名空间实例说明
2011/01/27 PHP
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
php版本的cron定时任务执行器使用实例
2014/08/19 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
JavaScript中的Array对象使用说明
2011/01/17 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
js日期联动示例
2014/05/02 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
jquery 中ajax执行的优先级
2015/06/22 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
2017/05/03 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
Python中的引用和拷贝浅析
2014/11/22 Python
简单介绍Python中的JSON使用
2015/04/28 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
Django基于Models定制Admin后台实现过程解析
2020/11/11 Python
我们是伦敦女孩:WalG
2018/01/08 全球购物
意大利时尚精品店:Nugnes 1920
2020/02/10 全球购物
皇家阿尔伯特瓷器美国官网:Royal Albert美国
2020/02/16 全球购物
租车协议书范本
2014/04/22 职场文书
初中学校对照检查材料
2014/08/19 职场文书
幼儿园教师安全责任书
2015/05/08 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
pytorch 使用半精度模型部署的操作
2021/05/24 Python
微软发布Windows 11今年最大更新22H2(附 ISO 镜像官方下载)
2022/09/23 数码科技