PHP如何防止用户重复提交表单


Posted in PHP onDecember 09, 2020

我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手:

首先从前端做限制。前端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可以采用可逆的加密算法, 尽可能复杂,因为明文还是不安全的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
提升PHP执行速度全攻略(上)
Oct 09 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
下拉列表多级联动dropDownList示例代码
Jun 27 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
使用PHPExcel导出Excel表
Sep 08 PHP
PHP中rename()函数的妙用讲解
Feb 28 PHP
如何让PHP编码更加好看利于阅读
May 12 PHP
Laravel + Elasticsearch 实现中文搜索的方法
Feb 02 PHP
如何在PHP中使用数组
Jun 09 PHP
Nginx+php配置文件及原理解析
Dec 09 #PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 #PHP
HTTP头隐藏PHP版本号实现过程解析
Dec 09 #PHP
PhpStorm连接服务器并实现自动上传功能
Dec 09 #PHP
PHP大文件分割分片上传实现代码
Dec 09 #PHP
PHP rsa加密解密算法原理解析
Dec 09 #PHP
PHP如何解决微信文章图片防盗链
Dec 09 #PHP
You might like
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
利用php输出不同的心形图案
2016/04/22 PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
2017/06/07 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
JavaScript DOM 添加事件
2009/02/14 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
详解AngularJS中的http拦截
2016/02/09 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
python 实现表情识别
2020/11/21 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
如何获得EntityManager
2014/02/09 面试题
环保专业大学生职业规划设计
2014/01/10 职场文书
党员群众路线承诺书
2014/05/20 职场文书
党员教师一句话承诺
2014/05/30 职场文书
行政申诉状范文
2015/05/20 职场文书
金陵十三钗观后感
2015/06/04 职场文书
新闻稿标题
2015/07/18 职场文书
小学秋季运动会通讯稿
2015/11/25 职场文书