4

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

登录代码是

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

8 回答 8

5

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

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

于 2013-06-03T21:43:30.857 回答
2

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

只要确保没有进一步的交互是可能的。

于 2013-06-03T21:43:47.747 回答
1

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

于 2013-06-03T21:43:47.137 回答
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

}
于 2013-06-03T22:31:18.310 回答
0

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

试试这个来检查会话

if(session_id() == '') {
    // session isn't started
 session_start();
}
else
{
 header("location:login.html");
}
于 2013-06-03T22:45:46.380 回答
0

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

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

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

于 2013-06-04T22:46:45.183 回答
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 的帮助。&我一周后成功了

于 2013-06-06T21:38:17.770 回答
0

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

当用户注销时,我将“会话cookie”设置为空。

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

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

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

于 2016-05-02T23:21:10.963 回答