我正在寻找一种方法来防止多种形式的提交。我有一个表单,例如chat.php及其在不同文件上的POST操作,例如submitter.php。
我尝试使用$_SESSION使用唯一令牌来实现该解决方案。chat有一个独特的$_SESSIONtoken,提交者有一个if $_POSTtoken==$_SESSIONtoken,我的问题是如果我打开了多个窗口,它就不能工作。猜测应用程序是一个聊天脚本,用户可以在多个窗口上聊天,如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']);
}发布于 2015-02-10 18:06:45
$_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>您可以做的另一件事是使用加密或单向散列来掩盖用户名。因此,您可以传递一个加密的用户名作为您的“实例”字段,然后在后端(使用会话令牌和实例)解密它,以确定哪个用户正在向服务器发送消息。
不过,这基本上滥用了PHP会话的概念。PHP会话用于浏览器,而不是浏览器选项卡/窗口。
https://stackoverflow.com/questions/28437412
复制相似问题