首页 > 解决方案 > html表单:发送时防止重新提交

问题描述

我有这个表格:

<form action="" method="post" name="my_form">
    <input type="text" name="my_input">
</form>

您可以编写一些文本并按回车键提交。

我的问题:当您多次按回车键时,它也会多次发送到我的服务器。

有这样的解决方案:

onsubmit="my_button=true;return true;"

但是这些解决方案需要一个提交按钮。

有没有办法在不添加(隐藏)提交按钮的情况下做到这一点?

标签: phphtmlformsform-submitenter

解决方案


如果您想绝对确定,例如,提交两次表单会导致严重损坏/导致恶意事情发生,那么您需要检查此服务器端。Web 开发和一般开发的一条规则是永远不要信任您的最终用户,并且通过简单地使用 JavaScript 阻止表单,您无法确保恶意用户不会绕过 JavaScript 来发送表单两次。

你可以做的是这样的:

重要提示:这只是一个概念证明示例来解释这个想法,这不是一个 100% 防弹的解决方案。

形式

<?php
session_start();
$_SESSION['nonce'] = random_number();
?>
<html>
...
<form method="post" action="process.php">
<input type="hidden" name="nonce" value="<?php echo $_SESSION['nonce']; ?>" />
... other form elements ...
</form>
...

进程.php

<?php
session_start();
$nonce = isset($_POST['nonce']) ? (int)$_POST['nonce'] : 0;
$session_nonce = $_SESSION['nonce'];

if ($_SESSION['nonce'] != $nonce) {
    die("Invalid nonce, double submission detected.");
}

$_SESSION['nonce'] += 1; // this will cause the previous check to fail on a second submission.

推荐阅读