我的smarty项目有一个小问题,确切地说是注销问题。我有一个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数据呢?
我认为这与smarty无关。这是浏览器/http的一般性问题。大多数浏览器都会在用户确认后重新发布表单数据。
使表单的重新发布无效的一种方法是传递一个密码/令牌(可能是guid或会话id),该密码/令牌也存储在会话数据中。当用户注销时,清除他们的会话(或者至少清除您正在检查的密码)。当用户登录时,请检查以确保确认代码与当前会话的确认代码匹配。
这种模式通常用于管理csrf攻击,通常被称为"同步器令牌"。这篇博客文章提供了一个很好的解释https://blog.whitehatsec.com/tag/synchronizer-token/