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 相关文章推荐
实时抓取YAHOO股票报价的代码
Oct 09 PHP
第十五节--Zend引擎的发展
Nov 16 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
PHP 工厂模式使用方法
May 18 PHP
从php核心代码分析require和include的区别
Jan 02 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
php创建桌面快捷方式实现方法
Dec 31 PHP
php源码之将图片转化为data/base64数据流实例详解
Nov 27 PHP
PHP+JQUERY操作JSON实例
Mar 23 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
浅谈如何提高PHP代码质量之单元测试
May 28 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 MVC框架路由学习笔记
2016/03/02 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
用js重建星际争霸
2006/12/22 Javascript
JavaScript 学习 - 提高篇
2007/02/02 Javascript
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
纯JavaScript实现的完美渐变弹出层效果代码
2010/04/02 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
引入外部js脚本加载慢与页面白屏问题的解决
2018/12/10 Javascript
图解javascript作用域链
2019/05/27 Javascript
vscode调试node.js的实现方法
2020/03/22 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
使用python实现生成用户信息
2017/03/20 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
2017/07/30 Python
Python3离线安装Requests模块问题
2019/10/13 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
主题酒店策划书
2014/01/28 职场文书
石油大学毕业生自荐信
2014/01/28 职场文书
反腐倡廉标语
2014/06/24 职场文书
重点工程汇报材料
2014/08/27 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
计划生育责任书
2015/05/09 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
python处理json数据文件
2022/04/11 Python