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 相关文章推荐
真正的ZIP文件操作类(php)
Jul 21 PHP
一步一步学习PHP(5) 类和对象
Feb 16 PHP
php中Smarty模板初体验
Aug 08 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
Jun 14 PHP
php分页示例分享
Apr 30 PHP
laravel安装和配置教程
Oct 29 PHP
PHP加密解密字符串汇总
Apr 26 PHP
PHP页面转UTF-8中文编码乱码的解决办法
Oct 20 PHP
WordPress中编写自定义存储字段的相关PHP函数解析
Dec 25 PHP
PHP实现批量上传单个文件
Dec 29 PHP
php 如何获取文件的后缀名
Jun 05 PHP
Laravel学习教程之IOC容器的介绍与用例
Aug 15 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 Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
Apache连接PHP后无法启动问题解决思路
2015/06/18 PHP
php魔术方法功能与用法实例分析
2016/10/19 PHP
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
javascript时间函数大全
2014/06/30 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
vue跳转方式(打开新页面)及传参操作示例
2020/01/26 Javascript
JavaScript forEach中return失效问题解决方案
2020/06/01 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python提示No module named images的解决方法
2014/09/29 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python测试人员需要掌握的知识
2018/02/08 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
英国100%防污和防水的靴子:Muck Boot Company
2020/09/08 全球购物
优秀的计算机专业求职信范文
2013/12/27 职场文书
先进党支部申报材料
2014/12/24 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
创业计划书之小型广告公司
2019/10/22 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang
Python提取PDF指定内容并生成新文件
2021/06/09 Python
低版本Druid连接池+MySQL驱动8.0导致线程阻塞、性能受限
2021/07/01 MySQL