防止多提交PHP

时间:2015-02-10 16:58:34

标签: php forms submit

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

我尝试使用$ _SESSION使用唯一令牌实现解决方案。 聊天有一个唯一的$ _SESSION [令牌],提交者有if $ _POST [token] == $ _ SESSION [token] 我的问题是,如果我打开了多个窗口,它就无法工作。 猜猜应用程序是一个聊天脚本,用户可以在多个窗口上聊天,比如chat.php?user = 5,chat.php?user = 10等)

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

有什么想法吗?

按要求编码....

chat.php

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

submitter.php

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

1 个答案:

答案 0 :(得分:1)

$_SESSION将在计算机上的所有打开的浏览器窗口中共享。因此,如果您打开Firefox并登录,则您打开的每个其他Firefox窗口也会登录到该服务。您可能需要的是页面中的令牌,它与每个请求一起提交(非常类似于 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>

您可以做的另一件事是使用加密或单向散列来掩盖用户名。因此,您可以将加密的用户名作为&#34;实例&#34;字段,然后在后端解密(使用会话令牌和实例)以确定哪个用户正在向服务器发送消息。

但基本上,这会滥用PHP会话的概念。 PHP会话适用于浏览器,而不适用于浏览器选项卡/窗口。