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写入WRITE编码为UTF8的文件的实现代码
Jul 07 PHP
php Undefined index的问题
Jun 01 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
使用NetBeans + Xdebug调试PHP程序的方法
Apr 12 PHP
php ctype函数中文翻译和示例
Mar 21 PHP
php计算指定目录下文件占用空间的方法
Mar 13 PHP
php通过exif_read_data函数获取图片的exif信息
May 21 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
PHP  Yii清理缓存的实现方法
Nov 10 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
Laravel 自带的Auth验证登录方法
Sep 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函数代码
2013/08/29 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
php提供实现反射的方法和实例代码
2019/09/17 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
JQuery.Ajax之错误调试帮助信息介绍
2013/07/04 Javascript
JQuery插件iScroll实现下拉刷新,滚动翻页特效
2014/06/22 Javascript
详解JavaScript中的客户端消息框架设计原理
2015/06/24 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JavaScipt选取文档元素的方法(推荐)
2016/08/05 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JS判断数组是否包含某元素实现方法汇总
2020/06/24 Javascript
python pdb调试方法分享
2014/01/21 Python
Python模块搜索概念介绍及模块安装方法介绍
2015/06/03 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
Python笔记之facade模式
2019/11/20 Python
Topshop法国官网:英国快速时尚品牌
2018/04/08 全球购物
zooplus意大利:在线宠物商店
2019/08/07 全球购物
房地产销售员的自我评价分享
2013/12/04 职场文书
省优秀教师事迹材料
2014/01/30 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
二人合伙经营协议书
2014/09/13 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
社会实践心得体会范文
2016/01/14 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL
python库sklearn常用操作
2021/08/23 Python