我想在我的应用程序中实现多表单提交预防,但是我没有做到这一点。
我尝试过不同的方法,使用Session方法,但它不起作用。
我实际上想要将数据插入数据库并向用户发送电子邮件。这个过程需要一点时间,比如1秒钟。
我尝试在表单的隐藏字段中创建一个令牌,也为它创建一个会话,并在每次页面加载时重新生成它。
问题是,在1秒钟内,访问者可以点击该按钮大约6-7次,并且会一遍又一遍地运行该脚本。
我试图检查Session是否等于隐藏表单的值,但每次都是相同的,所以它不会阻止提交。
有什么方法可以阻止这种漏洞吗?
如果我重新加载页面,我已经尝试过的功能已经有效,所以他们无法重新提交表单两次,但是对于一些重新提交它不起作用,当它获得时另一个请求,而另一个请求仍在处理中。
我有一个名为:view.php的文件。在这里,我有表单元素,包括不同的文本框和提交按钮。表单类型为POST,操作设置为默认值(在同一页面上提交)。
我还有一个名为:model.php的文件。在这里,我正在进行表单提交的检查过程。
我还有一个名为:controller.php的文件。在这里我包括上面的文件,所以它们是连接的。首先是model.php,最后是view.php。
因此,当有人点击View.php中的提交按钮时,我的model.php会检查文本框是否为空等,并在出现问题时给出错误。当一切正常时,它允许应用程序将信息添加到数据库并向用户发送有关确认的电子邮件。之后,用户被重定向。
这是整个过程。我想在没有JS的情况下阻止多次提交,并在数据库中插入加信息。
答案 0 :(得分:2)
它可以在PHP中完成,但我想说你最简单的选择是使用javascript,并在第一次点击时简单地禁用提交按钮。
Vanilla JS:
document.getElementById("yourButton").disabled = true;
jQuery的:
$('#yourButton').attr("disabled", true);
将任一功能附加到按钮的点击事件,然后你就完成了设置!
答案 1 :(得分:1)
如果你只需要防止意外的双重提交,那么只需在点击后用javascript禁用该按钮就可以完成这项工作。
如果您需要防范潜在的恶意用户,那么客户端解决方案的所有赌注都将被取消,因为来自客户端的任何内容都可能被伪造或篡改。这将需要用户身份验证(源IP地址可以更改,匿名用户可以只清除他们的会话或使用不同的浏览器提交),并使用您的数据库存储有关用户是否已提交(或当前正在运行的提交)的信息
当然,还有其他不同的想法,这取决于您希望解决方案的安全性或您可能拥有的其他要求。
答案 2 :(得分:0)
在您的PHP代码中,您可以执行以下操作:
session_start();
if(!empty($_POST) && empty($_SESSION['post'])) {
$_SESSION['post'] = true;
... do your code
unset($_SESSION['post']);
}
因此,如果帖子提交两次,则不会被接受。