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 相关文章推荐
dedecms模版制作使用方法
Apr 03 PHP
php图片加中文水印实现代码分享
Oct 31 PHP
PHP常用特殊运算符号和函数总结(php新手入门必看)
Feb 02 PHP
PHP中最容易忘记的一些知识点总结
Apr 28 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
Linux编译升级php的详细方法
Nov 04 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
php计算整个目录大小的方法
Jun 01 PHP
PHP第三方登录―QQ登录实现方法
Feb 06 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
PHP实现的装箱算法示例
Jun 23 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
Memcache 在PHP中的使用技巧
2010/02/08 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
详解php框架Yaf路由重写
2017/06/20 PHP
php session_decode函数用法讲解
2019/05/26 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
JQuery操作单选按钮以及复选按钮示例
2013/09/23 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
python保留小数位的三种实现方法
2020/01/07 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
安全的后院和健身蹦床:JumpSport
2019/07/15 全球购物
英国最大的割草机购买网站:Just Lawnmowers
2019/11/02 全球购物
学生档案自我鉴定
2013/10/07 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
20年同学聚会感言
2014/02/03 职场文书
测量工程专业求职信
2014/02/24 职场文书
入党综合考察材料
2014/06/02 职场文书
学校运动会报道稿
2014/09/23 职场文书
2014年班级工作总结
2014/11/14 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记