php防止表单重复提交的几种方法

  1. 引言

为什么要避免form表单被重复提交呢?因为不想让服务器重复处理没必要的数据,同时也是避免数据库产生重复的数据,避免表单重复提交也是让网站更安全的一种表现
  1. 什么情况下会导致表单重复提交

  • 点击提交按钮两次

  • 点击刷新按钮

  • 使用浏览器后退按钮重复之前的操作,导致重复提交表单

  • 使用浏览器历史记录重复提交表单

  • 浏览器重复的HTTP请求

  • 网页被恶意刷新

  1. 后端防止表单重复提交的几种解决办法

3.1原理

在from表单提交的时候,用户网络或者设备原因,有时候会导致表单的重复提交,如果数据库没有做好防范的话,容易产生不需要的数据记录,其实 一种方法是:可以在提交的时候解决这个问题,在数据库添加一个字段,每次提交上去的时候去随机修改这个字段,每次在提交操作之前去比对这个值,如果相同就允许提交,不同就不允许表单提交; 第二种方法是:服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面。当表单提交时会带上subToken,服务器获取表单信息判断session保存的subToken和表单提交subToken是否一致。若不一致或session的subToken为空或表单未携带subToken则不通过。首次提交表单时session的subToken与表单携带的subToken一致走正常流程,然后拦截器内会删除session保存的subToken。当再次提交表单时由于session的subToken为空则不通过。从而实现了防止表单重复提交

3.2 解决办法

(1).利用js设置按钮点击后变成灰色

点击完按钮之后变成灰色就不能点击了,用户需要再次提交表单的话就要刷新页面之后重新填写数据再提交了
<p>
<input type="”text”" name="”T1″" size="”20″">
<input type="”button”" value="”提交”" onclick="”Javascript:{this.disabled=true;document.form1.submit();}”">
</p>

(2).利用session

在session中放一个特殊标志,当表单页面被请求时,生成一个特殊的字符标志串,存在session中,同时放在表单的隐藏域里,接受处理表单数据时,检查标识字串是否存在,并立即从session中删除它,然后正常处理数据,如果发现表单提交里没有有效的标志串,这说明表单已经被提交过了,忽略这次提交,这使web应用有了更高级的XSRF保护加载提交的页面时候,生成一个随机数,存储在表单的隐藏输入框中,在接收页面的PHP代码如下
<?php
 
$session = Yii::app()->session;
$user_id = $this->user->id;
$sessionKey = $user_id.'_is_sending';
if(isset($session[$sessionKey])){
    $first_submit_time = $session[$sessionKey];
    $current_time = time();

    if($current_time - $first_submit_time < 10){
        $session[$sessionKey] = $current_time;
        $this->response(array('status'=>1, 'msg'=>'不能在10秒钟内连续发送两次。'));
    } else {
        unset($session[$sessionKey]);//超过限制时间,释放session";
    }
}

//第一次点击确认按钮时执行
if(!isset($session[$sessionKey])){
    $session[$sessionKey] = time();
}
?>

(3).利用cookies

原理和session差不多,但是 cookies一旦用户浏览器禁用 cookies,这功能就失效了
if(isset($_POST[‘submit'])){
    setCOOKIE("tempCOOKIE","",time()+30); 
    header("Location:".$_SERVER[PHP_SELF]);
    exit(); 
}
 
if(isset($_COOKIE["tempCOOKIE"])){ 
    setCOOKIE("tempCOOKIE","",0);
    echo "您已经提交过表单";
}

(4).利用header函数跳转

一旦用户点击提交按钮,处理完数据后跳到其他页面

if (isset($_POST[‘submit'])) {
    header(‘location:index.php');//处理数据后,转向到其他页面 
}

(5).利用数据库来添加约束

直接在数据库里添加唯一约束或创建唯一索引,一旦发现用户重复提交了,直接抛出警告或者提示,或者只处理第一次提交的数据,这是最直接有效的方法,要求前期的数据库设计和架构要考虑周全

(6).Post/Redirect/Get模式

在提交后执行页面重定向,这就是所谓的Post-Redirect-Get (PRG)模式,简言之,当用户提交了表单后,去执行一个客户端的重定向,转到提交成功信息页面
if (isset($_POST["ction"]) && $_POST[‘action'] == "submitted") { 
//处理数据,如插入数据后,立即转向到其他页面
header("location:submits_success.php"); 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/7150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rk3568 Android 添加IR遥控器

rk3568 添加IR遥控器 生活中充满了各种波长的电磁波&#xff0c;所谓的可见(色)光就是人眼可见的电磁波谱&#xff0c;其波长为 380~770nm&#xff0c;为了避免遥控器发射的光造成人眼不适及减少一般人造光源干扰&#xff0c;故选用人眼不可见的红外线(Infrared)波长&#xff…

交友项目【手机号登录注册功能】实现

目录 1&#xff1a;用户登录 1.1&#xff1a;接口文档 1.2&#xff1a;API接口定义 1.3&#xff1a;Dubbo服务提供者 配置文件 启动引导类 数据访问层 API接口实现 1.4&#xff1a;Dubbo服务消费者 UserController UserService 1.5&#xff1a;访问测试 1.6&#…

MapGIS 6.7安装方法教程

软件下载&#xff1a; https://www.xsoftnet.com/share/a0001blsbRz4p.html软件介绍&#xff1a; MapGIS是中国地质大学开发的通用工具型地理信息系统软件&#xff0c;它是在享有盛誉的地图编辑出版系统的MAPCAD基础上发展起来的&#xff0c;可对空间数据进行采集、存储、检索…

(一)MyBatis源码阅读:明晰项目结构

一、进入官网 点击以下链接进入官网:mybatis – MyBatis 3 | 配置,进入配置页面可以查看 MyBatis的配置结构&#xff0c;从该结构中可以知道MyBatis的配置结构。 ​ MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下&#xff1a;…

乐鑫 × 全国大学生物联网设计竞赛|探究基于 ESP32-S3 的农业革新应用

​​​​​​​ 2023 年全国大学生物联网设计竞赛&#xff08;下简称“竞赛”&#xff09;现已官宣启幕&#xff01;乐鑫科技 (688018.SH) 作为竞赛金牌合作伙伴&#xff0c;将为同学们带来基于 AI SoC ESP32-S3 的独立竞赛任务&#xff0c;并全程提供软硬件开发资源、技术培训…

单例设计模式

单例设计模式什么是设计 模式单例设计模式什么是单例设计模式如何实现单例设计模式单例设计模式的实现懒汉式饿汉式单例设计模式的优缺点什么是设计 模式 模式&#xff1a;套路 -----> 写代码的习惯 设计模式&#xff1a;前人总结具有代表性套路的模式 官方说法&#xff1a;…

FPGA有哪些优质的带源码的IP开源网站?

这是某乎上的一个问题&#xff0c;我觉得还不错&#xff0c;今天就系统性的总结一下1、fpga4funhttps://www.fpga4fun.com/你能在这个网站上找到什么&#xff1f;您可以找到信息页面&#xff0c;以及使用 FPGA 板构建的 FPGA 项目。注重点&#xff1a;项目。FPGA 项目使用一种称…

ChatGPT如何写作-怎么让chatGPT批量写作

ChatGPT如何写作 使用 ChatGPT 进行写作一般可以遵循以下步骤&#xff1a; 定义写作主题和目的。确定写作主题和目的&#xff0c;包括要解决的问题、目标读者群体以及需要涵盖的主要内容。 收集文献和资料。收集与主题相关的文献和资料&#xff0c;可以从互联网、书籍、报刊杂…

GPG Overview

Overview PGP目前支持的算法 非对称算法: RSA, ELG, DSA, ECDH, ECDSA, EDDSA对称算法: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256哈希算法: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224压缩算法: Uncompres…

Vue3学习笔记(9.3)

Vue3表单 我们可以用v-model指令在表单<input>、<textarea>及<select>等元素上创建双向数据绑定。 v-model会根据控件类型自动选取正确的方法来更新元素。 v-model会忽略所有表单的value、checked、selected属性的初始值&#xff0c;使用的是data选项中声明…

常用的32种设计模式

设计模式是在软件开发中重复出现的问题的解决方案&#xff0c;是由四人帮&#xff08;Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides&#xff09;在1994年的书《设计模式&#xff1a;可复用面向对象软件的基础》中提出的&#xff0c;共分为23种。后来又有其他人提…

Vue|计算属性

1. 计算属性1.1 差值语法1.2 methods1.3 计算属性1. 计算属性 1.1 差值语法 开始前分别在项目目录创建文件夹及页面如下 需求1&#xff1a;在两个文本框中分别输入姓和名的同时需要在下方将数据进行拼接组装&#xff0c;效果如下图 如果用传统的方式来实现的话&#xff0c;需要…

ATE测试工程师还有发展前景吗?薪资待遇怎么样?

近年来&#xff0c;芯片行业大火&#xff0c;不少学生想要转行&#xff0c;但奈何门槛太高。但其实一些岗位的招聘需求并不高&#xff0c;而且薪资待遇也比较可观。比如ATE工程师。目前芯片就业市场上ATE测试工程师非常紧缺&#xff0c;基本上大部分的芯片设计公司都存在这方面…

[ctfshow 2023 愚人杯] crypto,rev,pwn

这个愚人杯很厉害呀&#xff0c;感觉脑子不够用的。 第1个热身题&#xff0c;啥都没有&#xff0c;就一句提示“flag是一个不能说的秘密”我想了一天&#xff0c;第二天才想出来。 其它题也都很不错&#xff0c;一直没时间&#xff0c;看了部分别人的&#xff0c;现在babyre还…

【JavaWeb】3—JavaScript

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…

开发板 ping 虚拟机

开发板&#xff1a;正点原子的阿尔法开发板 虚拟机&#xff1a;vmware 所用设备&#xff1a;一根网线、开发板、笔记本电脑 连接方式&#xff1a;开发板通过网线连接至笔记本电脑网线接口&#xff01;&#xff01;&#xff01;此教程方法不需要禁用笔记本电脑的WIFI &#xff0…

redis源码解析(三)——dict

版本&#xff1a;redis - 5.0.4 参考资料&#xff1a;redis设计与实现 文件&#xff1a;src下的dict.c dict.h 一、dict.h数据结构rehash&#xff08;扩展/收缩&#xff09;操作二、dict.c1.dictGenericDelete2.dictNext3.dictScan4._dictGetStatsHt一、dict.h dict&#xff0…

Matplotlib 数据绘图基础入门

0、介绍 在使用机器学习方法解决问题的过程中&#xff0c;一定会遇到需要针对数据进行绘图的场景。Matplotlib 是支持 Python 语言的开源绘图库&#xff0c;因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档&#xff0c;深受 Python 工程师、科研学者、数据工程师等…

Redis7搭建主从+哨兵通俗易懂

背景前提–用到的命令 ps -ef |grep redis redis服务器启动(精确启动配置文件位置) redis-server redis6379.conf redis-server redis6380.conf redis-server redis6381.conf redis客户端登录 redis-cli -a 123456 -p 6379 redis-cli -a 123456 -p 6380 redis-cli -a 12345…

人工智能和5G相结合会碰撞出怎样的火花?

将第五代蜂窝技术和人工智能技术相结合是一个非常完美的例子&#xff0c;它有助于当今的创新者将两个独立的概念合作并应用于开发新的案例&#xff0c;并完善过去的创造&#xff0c;以更好地满足未来的需求。 随着新技术的不断涌现&#xff0c;越来越多的技术被合并和组合&…
最新文章