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 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
dedecms模版制作使用方法
Apr 03 PHP
php处理json时中文问题的解决方法
Apr 12 PHP
php 大数据量及海量数据处理算法总结
May 07 PHP
php fsockopen伪造post与get方法的详解
Jun 14 PHP
Java中final关键字详解
Aug 10 PHP
php简单实现批量上传图片的方法
May 09 PHP
PHP简单实现上一页下一页功能示例
Sep 14 PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 PHP
PHP读取XML格式文件的方法总结
Feb 27 PHP
php爬取天猫和淘宝商品数据
Feb 23 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 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里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
jQuery修改li下的样式以及li下的img的src的值的方法
2014/11/02 Javascript
JS使用post提交的两种方式
2015/12/03 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
浅谈js的异步执行
2016/10/18 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
koa2使用ejs和nunjucks作为模板引擎的使用
2018/11/27 Javascript
Vue中computed、methods与watch的区别总结
2019/04/10 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
使用layui前端框架弹出form表单以及提交的示例
2019/10/25 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
Python自定义简单图轴简单实例
2018/01/08 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
对python requests发送json格式数据的实例详解
2018/12/19 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
Python+logging输出到屏幕将log日志写入文件
2020/11/11 Python
python 写一个水果忍者游戏
2021/01/13 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
Linux文件系统类型
2012/02/15 面试题
应届生保险求职信
2013/11/11 职场文书
美术师范毕业生自荐信
2013/11/16 职场文书
职称评定自我鉴定
2014/03/18 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
安全第一课观后感
2015/06/18 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
如何计划开一家便利店?
2019/07/31 职场文书