smarty 模板引擎中的注销问题

logout issue in smarty template engine

我的 smarty 项目有一个小问题,准确地说是注销问题。我有一个 index.php 页面,它是 "main" 页面,它获取 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 数据?

我认为这与聪明无关。这是一个 browser/http 通用问题。大多数浏览器会在用户确认后重新post表单数据。

使表单的重新posts 无效的一种方法是传递秘密 code/token(可能是 guid 或您的会话 ID),它也存储在会话数据中。当用户注销时,清除他们的会话(或至少您正在检查的密码)。当用户登录时,检查以确保确认码与当前会话的确认码相匹配。

此模式通常用于管理 csrf 攻击,通常称为 'synchronizer token'。这个博客 post 提供了很好的解释 https://blog.whitehatsec.com/tag/synchronizer-token/