smarty模板引擎中的注销问题


logout issue in smarty template engine

我的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/