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 define函数的使用说明
Aug 27 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
php 中英文语言转换类
Sep 07 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
php防止SQL注入详解及防范
Nov 12 PHP
php实现保存submit内容之后禁止刷新
Mar 19 PHP
php比较相似字符串的方法
Jun 05 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
php实现购物车功能(上)
Jul 23 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
ThinkPHP实现的rsa非对称加密类示例
May 29 PHP
关于Yii中模型场景的一些简单介绍
Sep 22 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
php 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
PHP 类与构造函数解析
2017/02/06 PHP
PDO::beginTransaction讲解
2019/01/27 PHP
thinkphp5.1框架容器与依赖注入实例分析
2019/07/23 PHP
JavaScript数据类型检测代码分享
2015/01/26 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
详解JavaScript作用域 闭包
2020/07/29 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
Python函数中定义参数的四种方式
2014/11/30 Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
离线状态下在jupyter notebook中使用plotly实例
2020/04/24 Python
解决python3.x安装numpy成功但import出错的问题
2020/11/17 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
加拿大鞋子连锁店:Town Shoes
2016/09/26 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
经管应届生求职信范文
2014/05/18 职场文书
股东合作协议书
2014/09/12 职场文书
导游词之沈阳植物园
2019/11/30 职场文书
redis实现排行榜功能
2021/05/24 Redis
python中如何对多变量连续赋值
2021/06/03 Python
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL