我的智能项目遇到了一个小问题,准确地说是退出问题。我有一个index.php页面,它是“主”页面,它获取POST数据并根据当前数据指示操作。检查会话变量是否已设置。现在当我登录时,我的功能如下:
function login($value)
{
$res = $this->sql->checkLogin($value);
if($res)
{
//checks if user is admin
$isadm = $this->sql->isAdm($value);
if($isadm == true)
{
$_SESSION['user'] = $value['name'];
$_SESSION['adm'] = true;
$message = 'Admin';
$this->tpl->assign('var', $message);
if($_SESSION['adm'] == true)
{
//sets some variables for admin users
$navigation = 'navi';
$this->tpl->assign('navigation', $navigation);
}
$this->tpl->display('maint_main.tpl');
}
//user is not admin
else
{
$_SESSION['user'] = $value['name'];
$_SESSION['adm'] = false;
$message = 'Perus';
$this->tpl->assign('var', $message);
if($_SESSION['adm'] == true)
{
$navigation = 'navi';
$this->tpl->assign('navigation', $navigation);
}
$this->tpl->display('maint_main.tpl');
}
}
//login failes, show login form and info
else
{
$message = 'Login failed';
$this->tpl->assign('var', $message);
$this->tpl->display('login_form.tpl');
}
}
和注销功能:
function logout()
{
setcookie(session_name(), '', time()-42000, '/');
session_unset();
session_destroy();
$this->tpl->display('login_form.tpl');
}
这些工作只是关于它们应该的方式,但是当我注销并重定向到login_form.tpl时会发生真正的问题。如果我使用浏览器的后退按钮,则会检索带有用户名和密码的POST数据,然后再次登录。这导致登录后面的页面仍然可见。由于我对Smarty不太熟悉,但我无法找到解决这个问题的方法。那么基本上如何防止在注销后访问该POST数据?
答案 0 :(得分:1)
我不认为这与聪明有关。这是一个浏览器/ http泛型问题。大多数浏览器会在用户确认后重新发布表单数据。
重新发布表单无效的一种方法是传递一个秘密代码/令牌(可能是一个guid或你的会话ID),它也存储在会话数据中。当用户注销时,清除他们的会话(或至少是您要检查的密码)。当用户登录时,请检查以确保确认代码与当前会话的匹配。
此模式通常用于管理csrf攻击,通常称为“同步器令牌”。此博客文章提供了一个很好的解释https://blog.whitehatsec.com/tag/synchronizer-token/