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 相关文章推荐
编译问题
Oct 09 PHP
一棵php的类树(支持无限分类)
Oct 09 PHP
PHP微框架Dispatch简介
Jun 12 PHP
PHP的cURL库简介及使用示例
Feb 06 PHP
四个常见html网页乱码问题及解决办法
Sep 08 PHP
学习php设计模式 php实现模板方法模式
Dec 08 PHP
smarty高级特性之对象的使用方法
Dec 25 PHP
Yii实现显示静态页的方法
Apr 25 PHP
php处理json格式数据经典案例总结
May 19 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
Mar 28 PHP
Django 中 cookie的使用
Aug 17 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
Oct 03 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
网页游戏开发入门教程三(简单程序应用)
2009/11/02 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php 升级到 5.3+ 后出现的一些错误,如 ereg(); ereg_replace(); 函数报错
2015/12/07 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
Js 订制自己的AlertBox(信息提示框)
2009/01/09 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
vue iview多张图片大图预览、缩放翻转
2019/07/13 Javascript
three.js利用gpu选取物体并计算交点位置的方法示例
2019/11/25 Javascript
vue element-ui读取pdf文件的方法
2019/11/26 Javascript
[01:08:57]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第二场
2014/05/24 DOTA
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
4行Python代码生成图像验证码(2种)
2020/04/07 Python
利用PyTorch实现VGG16教程
2020/06/24 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
毕业设计计划书
2014/01/09 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
伏羲庙导游词
2015/02/09 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
大学军训心得体会800字
2016/01/11 职场文书
《纸船和风筝》教学反思
2016/02/18 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
Golang: 内建容器的用法
2021/05/05 Golang