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 Google的translate API代码
Dec 10 PHP
php mssql 日期出现中文字符的解决方法
Mar 10 PHP
深入PHP数据缓存的使用说明
May 10 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
PHP取二进制文件头快速判断文件类型的实现代码
Aug 05 PHP
mac下Apache + MySql + PHP搭建网站开发环境
Jun 02 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
Oct 09 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
Apr 04 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 PHP
PHP+mysql防止SQL注入的方法小结
Apr 27 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
Feb 16 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 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中addslashes函数与sql防注入
2014/11/17 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
关于PHP定时发送服务的解决办法
2017/04/23 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
简单的js分页脚本
2009/05/21 Javascript
javascript实现div的拖动并调整大小类似qq空间个性编辑模块
2012/12/12 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
jQuery事件对象的属性和方法详解
2017/09/09 jQuery
js时间戳与日期格式之间相互转换
2017/12/11 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
超好用的jQuery分页插件jpaginate用法示例【附源码下载】
2018/12/06 jQuery
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
vantUI 获得piker选中值的自定义ID操作
2020/11/04 Javascript
python实现dict版图遍历示例
2014/02/19 Python
python实现定制交互式命令行的方法
2014/07/03 Python
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python 常用string函数详解
2016/05/30 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
2014年客房服务员工作总结
2014/11/18 职场文书
2014年党风建设工作总结
2014/11/19 职场文书
寒山寺导游词
2015/02/03 职场文书
办公室年度工作总结2015
2015/05/21 职场文书