【问题标题】:How to kill a session after logging out using php使用php注销后如何终止会话
【发布时间】:2015-07-07 07:30:20
【问题描述】:

我看到了以下问题并尝试调整部分答案,但没有成功:'如何在用户按下注销并销毁会话后禁用后退浏览器按钮?'

我知道这个话题已经被讨论过很多,人们讨厌禁用后退按钮这句话。但是,如果我有一个包含重要信息的数据库,一旦该人注销,我如何防止某人点击后退按钮并返回上一页。

如果看过一个答案,下面可以回答的问题是: 我见过的一种故意破坏后退按钮使用的方法是在应用程序和每个表单中的每个 URL 上传递一个令牌。令牌会在每个页面上重新生成,一旦用户加载新页面,之前页面中的任何令牌都会失效。当用户加载页面时,页面只会显示正确的令牌(前一页上的所有链接/表单)是否传递给它。任何人都可以提供一些关于如何执行此操作的见解?

<?php 
session_start();
session_destroy();
$_SESSION = array();
header("location: login.php");
?>

标题应该放在哪里?

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");



<?php
session_start(); //starts the session
if($_SESSION['user']){ //checks if user is logged in
}
else{
    header("location:login.php"); // redirects if user is not logged in
}
$username = $_SESSION['user']; //assigns user value
$id_exists = false;
?>

我有一个 checklogin.php,它检查输入的用户名和密码与存储在 MySQL 数据库中的用户名和密码。然后它们被重定向到 file1.php。在此页面上有一个注销按钮。上面的代码存储在 logout.php 中。

当用户注销时,我不希望他们通过按后退按钮再次访问该文件。谢谢

【问题讨论】:

  • 禁用后退按钮不能,也不应该实现
  • 而不是 session_destroy,使用 unset($_SESSION["value1");未设置($_SESSION["value2"]);抄送
  • 为什么禁用后退按钮???只需在注销时销毁会话,甚至用户回来。检查会话并将用户重定向到特定页面
  • @Umair 我可能使用了错误的术语,禁用它的意思是会话被终止并且无法进行任何更改。在 file1.php 中,我尝试添加将重定向用户的代码,如果他们没有登录但似乎没有工作。

标签: php html


【解决方案1】:

至于标题,以下是我搜索后经常使用的网络服务器中的标题:

Cache-Control: private, pre-check=0, post-check=0, max-age=0
Expires: 0
Pragma: no-cache

单击结果页面中的链接后按返回按钮会在 Firefox 中显示错误消息。我看到的唯一显着区别是Expire: 0

【讨论】:

  • 谢谢,我会试试的,标题会放在 file1.php 中,对吗? (我所有的 phps 上都会有注销按钮)
  • 一般来说,您通常将这些标题设置为您不希望访问者返回的页面。所以在这种情况下,我认为至少应该是checklogin.php。以更一般的方式:由表单的 action 属性调用的所有脚本。
【解决方案2】:

登录页面:

<?php 
if (isset($_POST['uname'], $_POST['pwd'], $_POST['type'])) {
    $Username = $_POST['uname'];
    $Password = $_POST['pwd'];
    $User_Type=$_POST['type'];
    if (!(empty($Username) || empty($Password) || empty($User_Type))) 
    {
         $model = new UsersModel();
         $rowsCount = $model->checkUser($Username,$Password,$User_Type);
         if ($rowsCount!=0)
         {
              $_SESSION['user'] = $Username;
              header("Location:LoginViewController.php");

         } else {
              echo 'Bad user';
         }
    } else {
         echo 'Please, fill all inputs';
    }
} else {
    echo 'Bad form sent';
}
?>
 <form name="f1" method="POST" action="" >
// inputs
 </form>

LoginViewController.php:

<?php
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

if (!isset($_SESSION['user'])) {
header('Location: login.php');
exit();
}
echo 'You have successfully logged as '.$_SESSION['user']
?>

并添加标题以强制浏览器重新验证页面:

注销.php:

<?php 
session_start();
session_destroy();
$_SESSION = array();
header("location: login.php");
?>

【讨论】:

  • 这是我尝试使用的链接。我有一个登录页面,然后是一个我认为等同于登录视图控制器的检查登录,然后还有一个注销页面。注销后,我可以按后退按钮并返回数据库。您是否调整了上述脚本以适合您?
猜你喜欢
  • 2014-08-24
  • 2013-07-22
  • 2019-04-15
  • 1970-01-01
  • 2011-05-13
  • 2017-01-26
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多