目录
回复内容:
首页 后端开发 php教程 如何防止 POST 数据重复提交!

如何防止 POST 数据重复提交!

Jun 06, 2016 pm 08:31 PM
html mysql php

如题,在不使用验证码的情况下!

回复内容:

如题,在不使用验证码的情况下!

所有“通过前台JS,约束提交行为本身不会重复发生”的答案都是彻底错误的。

弱网络时如果POST请求到达了服务器响应却没回去,此时客户端报浏览器原生的超时错误,访客按F5重发,你的JS如之奈何?!

JS阻止重复点击按钮,仅仅是“锦上添花”的体验改进而已,根本称不上“防重复提交”的可靠方案。事实上我们也根本做不到“防止用户重复提交”——HTTP请求的到达能拦的了吗?这个需求的本质是:如何让重复提交的内容能够被识别出来(从而不被重复处理)

重复提交的鉴别,无非两种思路:

  1. 比对内容相同的提交是否重复出现。
  2. 为每次提交标号,比对相同编号的提交是否重复出现。

而其中(1)又是等同于(2)的。因为提交不可能全量比较,只可能计算一个哈希值(MD5等)去比,这样无非就是依赖提交的内容做了一个标号。

HTTP协议是无状态的,不能从HTTP协议本身下手,所以自然要在业务层加上这个标号。

考虑清楚前提,办法就容易了。用种种手段把表单标上号就可以。不限于以下方法:

  • 服务器下发表单时,在表单里附加一个毫秒时间戳或唯一ID
  • 客户端JS在表单内,插入点按提交按钮的时间戳,以及浏览器的信息
  • 服务器端收到表单时,对表单的内容做哈希签名并缓存
  • 有些业务逻辑天生就是防重复的。例如订单的状态流转,一般都是单向、不重复且不可逆的。此时要充分利用业务逻辑,尽量在直接回弹不合法请求的同时,就把重复提交顺手一起干掉。

后端生成token,保存数据前验证

楼上说得都很好了,补充下,除了使用token进行校验外,还可以使用POST-Redirect-GET(PRG)的方式——最后呈现给用户的是一个GET的页面,即使用户按F5刷新页面也不会导致重复提交表单。

参考一下:表单令牌

PHP生成表单时设置一个token隐藏域,提交后JS则可以辅助把提交按钮设为不可点击.
提交表单时进行验证,相同则写入数据库并生成新的token.
token生成算法,比如:

<code>$token = sha1(uniqid(mt_rand(), true));
</code>
登录后复制

uniqid获取一个带前缀(mt_rand),末尾带熵(true),基于当前时间微秒数的唯一编号.mt_rand用于生成更好的随机数.

作为一名Python程序猿,使用Django框架时,直接在模板里面,在

里面直接加上{% csrf_token %}

在第一次提交之后设置一定时间才能提交第二次,javascript里面有一个叫做debounce的可以应用到你得场景,
你可以把你提交的动作放到debounce里面,例如:

<code>'use strict';

var debounce = function(func, timeout) {

    var timer;

    return function() {
        var _this = this;
        var args = Array.prototype.slice.call(arguments);
        clearTimeout(timer);
        timer = setTimeout(function() {
            func.apply(_this, args);
        }, timeout);
    };
};

</code>
登录后复制

这样当你再调用post的提交方法submit()的时候,

<code>var debounced = debounce(submit, 100);

debounced();
debounced();
debounced();
debounced();
</code>
登录后复制

它只会提交一次。

1、header地址重定向
2、JS跳转其他页面
3、设置Token并验证

做一个令牌吧,当正在处理数据时,令牌为false,不能提交;当无数据处理时,令牌为true,提交处理数据。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP的未来:改编和创新 PHP的未来:改编和创新 Apr 11, 2025 am 12:01 AM

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

了解HTML,CSS和JavaScript:初学者指南 了解HTML,CSS和JavaScript:初学者指南 Apr 12, 2025 am 12:02 AM

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

phpmyadmin怎么打开 phpmyadmin怎么打开 Apr 10, 2025 pm 10:51 PM

可以通过以下步骤打开 phpMyAdmin:1. 登录网站控制面板;2. 找到并点击 phpMyAdmin 图标;3. 输入 MySQL 凭据;4. 点击 "登录"。

PHP与Python:了解差异 PHP与Python:了解差异 Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

HTML的角色:构建Web内容 HTML的角色:构建Web内容 Apr 11, 2025 am 12:12 AM

HTML的作用是通过标签和属性定义网页的结构和内容。1.HTML通过到、等标签组织内容,使其易于阅读和理解。2.使用语义化标签如、等增强可访问性和SEO。3.优化HTML代码可以提高网页加载速度和用户体验。

MySQL:世界上最受欢迎的数据库的简介 MySQL:世界上最受欢迎的数据库的简介 Apr 12, 2025 am 12:18 AM

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

为什么要使用mysql?利益和优势 为什么要使用mysql?利益和优势 Apr 12, 2025 am 12:17 AM

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

redis怎么使用单线程 redis怎么使用单线程 Apr 10, 2025 pm 07:12 PM

Redis 使用单线程架构,以提供高性能、简单性和一致性。它利用 I/O 多路复用、事件循环、非阻塞 I/O 和共享内存来提高并发性,但同时存在并发性受限、单点故障和不适合写密集型工作负载的局限性。

See all articles