防止多次提交 PHP

Prevent multi submit PHP

我正在寻找一种方法来防止多表单提交。我有一个表单,例如 chat.php 及其对不同文件的 POST 操作,例如 submitter.php.

我已尝试使用 $_SESSION 使用唯一令牌实施解决方案。 聊天有一个唯一的 $_SESSION[token] 并且提交者有 if $_POST[token]==$_SESSION[token] 我的问题是,如果我打开了多个 windows,它就不起作用了。 猜测该应用程序是一个聊天脚本,用户可以在其中与多个 windows 聊天,例如 chat.php?user=5、chat.php?user=10 等)

如果用户打开了一个 window,那就完美了。

有什么想法吗?

按要求编码....

chat.php

$_SESSION['token'] = md5(session_id() . microtime());

submitter.php

if($_POST['submg'] == "1") {
    if ($_POST['token'] == $_SESSION['token']) {
     // do stuff
    }
    unset($_SESSION['token']);
}

$_SESSION 将在一台机器上所有打开的浏览器 windows 之间共享。因此,如果您打开 Firefox 并登录,您打开的所有其他 Firefox window 也会登录该服务。您可能想要的是页面 中的令牌 与每个请求一起提交(很像 CSRF 令牌),它是 页面实例。然后,$_SESSION 变量和令牌的组合可用于识别特定会话中的特定浏览器。

编辑:示例如下。

<?php
session_start();
$instance = null;

if (! array_key_exists('token', $_SESSION)) {
    $_SESSION['token'] = md5(time() . 'salt value');
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $instance = $_POST['instance'];
} else {
    $instance = md5(time() . 'some other salt value');
}
?>
<p>You are session <?php echo $_SESSION['token']; ?>, instance <?php echo $instance; ?></p>
<form method="POST" action="">
    <button type="submit" name="instance" value="<?php echo $instance; ?>">Submit</button>
</form>

您可以做的另一件事是使用加密或单向哈希来屏蔽用户名。因此,您可以将加密的用户名作为您的 "instance" 字段传递,然后在后端对其进行解密(使用会话令牌和实例)以确定哪个用户正在向服务器发送消息。

不过,基本上,这会滥用 PHP 会话的概念。 PHP 会话用于浏览器,而不是浏览器 tab/window。