Logout用户仍然可以访问受保护的页面

时间:2013-06-03 21:39:25

标签: php html mysql

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

登录代码

<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");
?>

8 个答案:

答案 0 :(得分:5)

当用户向其浏览器发出“返回”时,浏览器可以决定从其缓存中加载页面。用户将无法执行登录用户可以执行的操作,因为会话已被销毁且无效。

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

答案 1 :(得分:2)

它被称为缓存。因此,没有向服务器发出请求。

确保无法进一步互动。

答案 2 :(得分:1)

header("location:login.html");之后您可能还希望die();阻止输入已登录的html。

答案 3 :(得分:0)

请注意 :这只是一个“暗示性”答案。

这是我使用的,效果相当好。

在您的表单中,必须具有.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

}

答案 4 :(得分:0)

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

尝试此操作以检查会话

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

答案 5 :(得分:0)

在其他人提到缓存问题时,这在黑暗中就是一种刺痛。不久前我遇到了类似的问题我相信我通过手动取消设置我正在检查的会话变量来解决它。我不确定这会有所帮助,但它似乎对我有用。

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

这是一个尝试一切可能的案例。

答案 6 :(得分:0)

创建了一个名为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");
}

在其他情况下,您必须在该特定页面中对每个页面进行逐步命名。

&安培;注销包含

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

感谢PHP_Noob的帮助。 &安培;我在一周后成功了

答案 7 :(得分:0)

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

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

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

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

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