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输出缓存(output_buffering)的深入理解
Jun 13 PHP
php遍历目录与文件夹的多种方法详解
Nov 14 PHP
PHP中你应该知道的require()文件包含的正确用法
Jun 12 PHP
在PHP程序中使用Rust扩展的方法
Jul 03 PHP
深入理解PHP内核(一)
Nov 10 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
Dec 09 PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 PHP
分析php://output和php://stdout的区别
May 06 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
Jun 04 PHP
PHP安装memcache扩展的步骤讲解
Feb 14 PHP
laravel框架与其他框架的详细对比
Oct 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
处理php自动反斜杠的函数代码
2010/01/05 PHP
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
PHP curl 或 file_get_contents 获取需要授权页面的方法
2017/05/05 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
jquery remove方法应用详解
2012/11/22 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
jQuery.form.js的使用详解
2017/06/14 jQuery
jQuery zTree搜索-关键字查询 递归无限层功能实现代码
2018/01/25 jQuery
JS关于刷新页面的相关总结
2018/05/09 Javascript
Jquery遍历筛选数组的几种方法和遍历解析json对象,Map()方法详解以及数组中查询某值是否存在
2019/01/18 jQuery
原生js实现抽奖小游戏
2019/06/27 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
浅析Python中的for 循环
2016/06/09 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
python selenium firefox使用详解
2019/02/26 Python
Python argparse模块使用方法解析
2020/02/20 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
HTML5 Canvas draw方法制作动画效果示例
2013/07/11 HTML / CSS
小学校园文化建设汇报材料
2014/08/19 职场文书
2014年计生工作总结
2014/11/21 职场文书
主题班会开场白
2015/06/01 职场文书
解决redis sentinel 频繁主备切换的问题
2021/04/12 Redis
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS