我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦。

那么如何规避这中重复提交表单的现象出现呢?我们可以从很多方面入手,首先从前端做限制。前端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="www.helloweba.com">   <input type="submit" class="btn" value="提交" />   </form>
<?php
}
?> 

以上是一个简单的防止重复提交表单的例子,仅供参考。那么实际项目开发中,会对表单token做更复杂的处理,即我们说的令牌验证。可能要做的处理有:验证来源域,即来路,是否为外部提交;匹配要执行的动作,是添加、修改or删除;其次最重要的是构建token,token可以采用可逆的加密算法,尽可能复杂,因为明文还是不安全的。令牌验证的具体算法可以参考各大PHP框架,如ThinkPHP提供了很好的令牌验证功能。

声明:本文为原创文章,helloweba.com和作者拥有版权,如需转载,请注明来源于helloweba.com并保留原文链接:http://www.helloweba.com/view-blog-332.html

转载于:https://www.cnblogs.com/arvintang/p/5428030.html

如何防止用户重复提交表单相关推荐

  1. php防止订单重复计算,php防止用户重复提交表单

    我们提交表单的时候,不能忽视的一个限制是防止用户重复提交表单,因为有可能用户连续点击了提交按钮或者是攻击者恶意提交数据,那么我们在提交数据后的处理如修改或添加数据到数据库时就会惹上麻烦. 效果图: 那 ...

  2. 客户端服务端防止用户重复提交表单

    一.什么是表单重复提交? 当网络有延迟时,用户提交的表单等数据还没有完成此次提交,但用户又多次点击提交,造成用户数据在数据库或存储中被提交多次. 利用线程延迟,简单模拟重复提交. 表单页面为form. ...

  3. 防止用户重复提交表单数据,session方式,js方式

    1. 使用session的方式创建Token令牌解决 创建一个生成令牌的工具类,在该类中有返回类的对象,生成token的方法 public class TokenUtil {/**单例设计模式(保证类 ...

  4. php js 防止重复提交表单,php如何防止form重复提交

    php如何防止form重复提交 引入cookie机制来解决(推荐学习:PHP编程从入门到精通) 用户提交表单到后端,在 Cookie 中做标记,指定时间内重复提交无效.但是用户禁用 Cookie 这个 ...

  5. php ajax 重复提交,ThinkPHP防止重复提交表单的方法实例分析

    本文实例总结分析了ThinkPHP防止重复提交表单的方法.分享给大家供大家参考,具体如下: 为什么会有表单重复的坑 在开发中,如果一个新增或修改的表单,在后台完成数据库操作后我们设定的不是跳转到其他页 ...

  6. java mvc中重复提交表单,spring mvc 防止重复提交表单的两种方法,推荐第二种

    第一种方法:判断session中保存的token 比较麻烦,每次在提交表单时都必须传入上次的token.而且当一个页面使用ajax时,多个表单提交就会有问题. 注解Token代码: package c ...

  7. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例:1.写一个注册页面,把请求交给 struts处理<form action="${pageContext.r ...

  8. ajax如何提交多表单的值_菜狗教程-03-如何解决快速提交两次重复提交表单的问题...

    菜狗教程-03-如何解决快速提交两次重复提交表单的问题 如何解决快速提交两次重复提交表单的问题? 我在前端和后端分别找到了一种简单实用的方式 vue如何解决快速重复提交表单的问题? (1) 在组件中增 ...

  9. 防止刷新或后退页面重复提交表单

    刷新或后退页面会引起重复提交表单,为了避免这个头疼的问题发生,有几种方法可以实现.网上已经有很多实现的方式的思路,比如提交后禁用按钮.重定向和令牌,但前两种方式有时候不起作用或者说没有"安全 ...

最新文章

  1. 5G LAN — Overview
  2. Eclipse 启动问题:'Initilizing Java Tooling' has encountered a problem(。。。)
  3. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
  4. java nio socket长连接_netty学习实战—实现websocket长连接和socket之间进程通信
  5. 一个数的二进制中有多少个1
  6. 每日一道算法题--leetcode 746--使用最小花费爬楼梯--python
  7. 搭建卷积神经网络怎么确定参数_汽车冲压模具中拉延件各参数要怎么确定?本文教你确定方法!...
  8. c# xml文件新增同级节点_C# xml文件的创建,修改和添加节点 。
  9. oracle返回当前日期函数,oracle 日期时间函数使用总结
  10. 计算机网络原理思维导图
  11. spring boot生成Excel表格 导出/导入
  12. 利用极小极大搜索和alpha-beta剪枝算法预测五子棋对弈落子
  13. Failed to create/setup connection: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。
  14. [noip模拟赛]算算数
  15. 使用unity3d 接入anySDK的总结2
  16. Javaweb中上传图片,获取相对路径,绝对路径
  17. 极致的遮罩处理(一):DeepFaceLab手动遮罩编辑。
  18. 音乐 组件 (音频, 视频)
  19. 第六章 go 文件操作
  20. Lightswitch中使用LINQ

热门文章

  1. html标签info,HtmlTrInfo 元素
  2. harmonyos公测招募,nova为主 HarmonyOS 2.0开发者Beta公测再招募
  3. java大量浮点数如何作比较,Java如何正确比较浮点数
  4. mysql 获取年预提,【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。...
  5. 静态内部类----Java
  6. C++ 重载强制类型转换运算符
  7. Java商品信息查询
  8. Spring Boot 后台验证 Hibernate Validation
  9. python matplotlib模块教程_Python中的Matplotlib模块入门教程
  10. 树莓派 小屏幕_树莓派学习手动积累(1)