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 01 PHP
PHP 各种排序算法实现代码
Aug 20 PHP
php Notice: Undefined index 错误提示解决方法
Aug 29 PHP
判断PHP数组是否为空的代码
Sep 08 PHP
php笔记之:文章中图片处理的使用
Apr 26 PHP
浅谈php命令行用法
Feb 04 PHP
PHP抽奖算法程序代码分享
Oct 08 PHP
PHP数组操作简单案例分析
Oct 15 PHP
PHP中时间加减函数strtotime用法分析
Apr 26 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
Aug 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读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
实例详解PHP中html word 互转的方法
2016/01/28 PHP
js类的静态属性和实例属性的理解
2009/10/01 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
javascript获取重复次数最多的字符
2015/07/08 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
JS伪继承prototype实现方法示例
2018/06/20 Javascript
JS中数据结构之栈
2019/01/01 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
python对url格式解析的方法
2015/05/13 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Django 在iframe里跳转顶层url的例子
2019/08/21 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
HTML5混合开发二维码扫描以及调用本地摄像头
2017/12/27 HTML / CSS
澳大利亚最大的女装零售商:Millers
2017/09/10 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
英国运动服、设备及配件网站:DW Sports
2019/12/04 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
写给妈妈的道歉信
2014/01/11 职场文书
授权委托书格式模板
2014/04/03 职场文书
竞选劳动委员演讲稿
2014/04/28 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
见习报告怎么写
2014/10/31 职场文书
入党自荐书范文
2015/03/05 职场文书
一篇文章弄懂Python中的内建函数
2021/08/07 Python
《堡垒之夜》联动《刺客信条》 4月7日正式上线
2022/04/06 其他游戏
SQL Server使用导出向导功能
2022/04/08 SQL Server