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