php - 提交 : Please do not click submit more than once! 时避免 PHP 中的竞争条件

标签 php

前阵子,在线应用程序常说“不要多次点击提交”。现在已经没有了,对吧?例如,在 PHP 中,您如何防范这种情况?

我正在使用的一个解决方案涉及在 session 中放置一个变量,因此您不能每 10 秒向一个页面提交超过一次。这样数据库工作就完成了,所以可以进行正常的检查。显然,这感觉像是黑客攻击,而且可能确实如此。

编辑:感谢大家提供 Javascript 解决方案。这很好,但需要做一些工作。 1) 这是一个输入 type=image 和 2) 提交必须一直触发直到 Spry stuff说没关系。这个编辑只是我的提示,基本上,因为我想在看了 Spry 的东西之后我就能弄明白。

编辑:并不是说任何人都会与 Spry 东西集成,但这是我使用 Prototype 实现 document.getElementByid 的最终代码。欢迎评论!

function onSubmitClick() {
    var allValid = true;
    var queue = Spry.Widget.Form.onSubmitWidgetQueue; 
    for (var i=0;i<queue.length; i++) {
        if (!queue[i].validate()) {
            allValid = false;
            break;
        }
    }

    if (allValid) {
        $("theSubmitButton").disabled = true;
        $("form").submit();
    }
}

出于某种原因,第二次提交表单是必要的...

最佳答案

您应该同时进行客户端和服务器端保护。

客户端 - 禁用按钮,例如正如 cletus 所描述的那样,由 jquery 提供。

服务器端 - 在表单中放置一个 token 。如果有两个提交具有相同的 token,则忽略后者。使用这种方法,您可以免受 CSRF 的侵害.

关于php - 提交 : Please do not click submit more than once! 时避免 PHP 中的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/414835/

相关文章:

php - 需要帮助使用加密将 Encryption Blowfish php 转换为 Nodejs

php - 预订过程中的电子邮件 ID 捕获

c# - 如何将代码从 C# 转换为 PHP

php - Paypal 多次付款

php - 未找到基表或 View :1146 in symfony3

php - Yii 中声明的 $content 变量在哪里?

php - INSERT ON DUPLICATE KEY UPDATE 语句的复杂 mysql 查询错误

PHP & MySQL : How can i neglect empty variables from select

javascript - while 循环中创建的文本框的值

php - 我应该怎么做才能在我自己的网络服务器上执行 php 脚本?