首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止多提交PHP

问防止多提交PHP
EN

Stack Overflow用户
提问于 2015-02-10 16:58:34
回答 1查看 688关注 0票数 0

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

我尝试使用$_SESSION使用唯一令牌来实现该解决方案。chat有一个独特的$_SESSIONtoken,提交者有一个if $_POSTtoken==$_SESSIONtoken,我的问题是如果我打开了多个窗口,它就不能工作。猜测应用程序是一个聊天脚本,用户可以在多个窗口上聊天,如chat.php?user=5、chat.php?user=10等)

如果用户有一个窗口打开,这是完美的工作。

有什么想法吗?

按要求编码..。

chat.php

代码语言:javascript
复制
$_SESSION['token'] = md5(session_id() . microtime());

submitter.php

代码语言:javascript
复制
if($_POST['submg'] == "1") {
    if ($_POST['token'] == $_SESSION['token']) {
     // do stuff
    }
    unset($_SESSION['token']);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-10 18:06:45

$_SESSION将在机器上所有打开的浏览器窗口上共享。因此,如果您打开Firefox并登录,您打开的其他Firefox窗口也会登录到该服务中。您可能需要的是页面中的令牌,该令牌与每个请求(非常类似于CSRF令牌)一起提交,该令牌对于页面实例是唯一的。然后,可以使用$_SESSION变量和令牌的组合来标识特定会话中的特定浏览器。

编辑:下面的例子。

代码语言:javascript
复制
<?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>

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28437412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档