注销后,用户仍可访问受保护页面


After Logout user can still access protected page

我添加了一个会话&使用此代码防止用户在注销后访问页面,但我不能这样做。用户仍然可以访问上一页。下面是代码

登录码为

<form id="form1" name="form1" method="post" action="alogin.php" onsubmit="return(validate());">
  <p align="center"><font style="Arial" size="+1" color="#000000">Username : 
    <label for="name"></label>
    <input type="text" name="name" id="name" />
  </p>
  <br />
  <br />
  <p align="center">Password : 
    <label for="pass"></label>
    <input type="password" name="pass" id="pass" /></font>
  </p>
  <p align="center">
    <br />
    <br />
    <input type="submit" name="submit" id="submit" value="Login" />
  </p>
</form>

在每个受保护的页面中我都使用这个

<?php
session_start();
if (!isset($_SESSION['name'])) {
  header("location:login.html");
} else {
}
?>

而logout.php包含

 <?php
session_start();
$_SESSION=array();
setcookie(session_name(),"",time()-3600);
session_destroy();
header("Location: login.html?id=You are successfully logged out");
?>

当用户向浏览器发出"back"时,浏览器可以决定从缓存中加载页面。用户将无法做已登录用户可以做的事情,因为会话已被销毁并且无效。

一个可能的解决方法是在那些敏感的页面上包含一个ajax请求,检查用户是否仍在登录。如果是,则显示敏感元素(或通过ajax获取),如果不是(用户已注销),则显示警告或将其转发到登录页面(通过js)。

这就是所谓的缓存。因此,没有向服务器发出请求。

header("location:login.html");之后您可能还想执行die();以防止登录的html也被输出

请注意 :这只是一个"暗示性"的答案。

这是我使用的,效果很好。

在您的表单中,必须具有.php文件扩展名,使用以下内容:

session_start();
$firstname = $_SESSION['unique_session_name'];
// yours being $name
// some code
$firstname = $_POST['firstname'];

然后,在受保护的页面中:

session_start();
$_SESSION["unique_session_name"] = $_POST["firstname"];
   if (isset($_SESSION['unique_session_name'])) {
// some code
}

按照您提到的逻辑,似乎是您如何检查会话的问题。如果您在受保护的页面上执行session_start();,然后检查会话,则不起作用。

尝试检查会话

if(session_id() == '') {
    // session isn't started
 session_start();
}
else
{
 header("location:login.html");
}

这有点像在黑暗中摸索,因为其他人已经提到了缓存问题。不久前我有一个类似的问题,我相信我通过手动取消设置我正在检查的会话变量来解决它。我不确定这是否会有帮助,但它似乎对我有用。

session_unset();
unset($_SESSION['name']);

这是一个尝试一切可能的情况。

创建了一个名为session.php的文件

   <?php
                    ob_start();    
                    session_start();
                    // just call this file session.php and share it in all your file, which you want to protect with session,
    ?>

我们需要将文件包含在我们想要保护的每个页面中,就像这样

<?php
include 'session.php';
var_dump($_SESSION);
if(isset($_SESSION) ){
        if(!$_SESSION['name']=='admin'){
                header("Location:login.html?id=access_forbidde");
        }
}else{
header("Location:viewall.php?id=access_forbidde");
}

在else中,您必须在该特定页面中分别命名每个页面。

,注销包含

<?php
include 'session.php';
$_SESSION=array();
setcookie(session_name(),"",time()-3600);
session_destroy();
header("Location: login.html?id=logout_successful");
?>

感谢PHP_Noob的帮助。,

我创建了一个名为" session-cookie "的cookie,并在用户成功登录时将其值设置为true。

当用户注销时,我将'session-cookie'设置为空。

然后在Javascript中添加以下内容,

<script>
if( document.cookie.indexOf("session-cookie") < 0 ) {
 location.replace('http://[any url]/'); 
}
</script>

他们可以点击后退键查看缓存的页面,但它会迅速重定向并覆盖历史记录中的当前页面。