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将数据库中的电话号码读取出来并生成图片
Aug 31 PHP
php中批量修改文件后缀名的函数代码
Oct 23 PHP
php中将字符串转为HTML的实体引用的一个类
Feb 03 PHP
精美漂亮的php分页类代码
Apr 02 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
destoon公司主页模板风格的添加方法
Jun 20 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php获取本机真实IP地址实例代码
Mar 31 PHP
基于PHP实现通过照片获取ip地址
Apr 26 PHP
php微信公众号js-sdk开发应用
Nov 28 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 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防止伪造的数据从URL提交方法
2014/06/27 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
PHP mysql事务问题实例分析
2016/01/18 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
PHP 实现链式操作
2021/03/09 PHP
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
xml 封装与解析(javascript和C#中)
2009/07/26 Javascript
基于jquery的checkbox下拉框插件代码
2010/06/25 Javascript
ExtJS4如何给同一个formpanel不同的url
2014/05/02 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
Bootstrap table使用方法总结
2017/05/10 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
11个Javascript小技巧帮你提升代码质量(小结)
2020/12/28 Javascript
[50:28]LGD女子学院第三期 DOTA2复仇之魂教学
2013/12/24 DOTA
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
python利用selenium进行浏览器爬虫
2019/04/25 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
HTML5手机端弹出遮罩菜单特效代码
2016/01/27 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
Java基础知识面试题
2014/03/25 面试题
汽车销售求职自荐信
2013/10/01 职场文书
社区学习十八大感想
2014/01/22 职场文书
趣味活动策划方案
2014/02/08 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
消防验收申请报告
2015/05/15 职场文书
企业宣传稿范文
2015/07/23 职场文书
Mysql数据库命令大全
2021/05/26 MySQL