代码之家  ›  专栏  ›  技术社区  ›  AmitChaudhary

smarty模板引擎中的注销问题

  •  0
  • AmitChaudhary  · 技术社区  · 11 年前

    我的智能项目有一个小问题,确切地说是注销问题。我有一个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数据?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Allan Nienhuis    11 年前

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

    一种使表单重新发布无效的方法是传递一个密码/令牌(可能是guid或会话id),该密码/令牌也存储在会话数据中。当用户注销时,清除他们的会话(或至少是您正在检查的密码)。当用户登录时,请检查以确保确认代码与当前会话的确认代码匹配。

    此模式通常用于管理csrf攻击,通常称为“同步器令牌”。这篇博客文章提供了很好的解释 https://blog.whitehatsec.com/tag/synchronizer-token/