智能模板引擎中的注销问题

时间:2015-02-26 14:47:59

标签: php login 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数据?

1 个答案:

答案 0 :(得分:1)

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

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

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