【问题标题】:After Logout user can still access protected page注销后用户仍然可以访问受保护的页面
【发布时间】:2016-05-03 07:21:10
【问题描述】:

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

登录码是

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

【问题讨论】:

  • “受保护的页面” php、html 是什么类型的?
  • 您需要在您声明"in each protected page i used this" 的地方添加session_start(); 作为&lt;?php 下的第一行。
  • @fred 抱歉,我忘了提到我使用了 session_start();在每一页。问题已编辑
  • 如果用户只是点击返回按钮,这可能是浏览器缓存问题吗?
  • @bksi 如果您查看受保护的页面,您可以猜出它肯定是 PHP 兄弟

标签: php html mysql


【解决方案1】:

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

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

【讨论】:

  • 我很困惑。你能解释一下吗?几天前,一切正常,并按照会话代码中的指示重定向到登录页面。不知道添加更多代码后发生了什么。
  • 关于设置。您可以设置标头,带有过期页面,因此浏览器可以通过请求而不是其缓存来刷新页面。
  • 页面可以保存到用户的磁盘上,如果用户点击返回,浏览器不会从您的站点下载页面,而是从硬盘下载页面,此时页面正在保存用户已登录以便显示该页面。
  • @bksi 如何。对不起,我完全是菜鸟:/
  • @flesh hmm 但我认为事实并非如此。可能是我错了,因为一切正常
【解决方案2】:

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

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

【讨论】:

  • 几天前一切正常,并按照会话代码中的指示重定向到登录页面。不知道添加更多代码后发生了什么。
  • @CodingNoob - 神秘的梅格已经睡觉了! - 所以不能告诉你为什么添加额外的代码会影响缓存行为。也许你不再使用“POST”了。
  • o.O 这就是重点。我想我做到了。让我再搜索一遍我的网页
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    这是我使用的并且效果很好。

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

    【讨论】:

    • 谢谢老兄。我会试一试:)
    • 我试过了。其他部分正在工作,这意味着会话没有在任何地方设置形式。我对吗?我试过这个 "" 是的,我在反之亦然的情况下应用了这个,只是为了检查,如果根本不工作:/
    • @CodingNoob 您是否更改了表单以反映firstname 而不仅仅是name
    【解决方案5】:

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

    试试这个来检查会话

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

      • 老兄,它仍然无法正常工作。我现在对这些东西快要疯了:@。我想我需要重新编写所有代码。有人可以帮我吗?
      【解决方案7】:

      创建了一个名为 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 的帮助。一周后我成功了

      【讨论】:

        【解决方案8】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2021-10-17
          • 2014-09-06
          • 2021-09-26
          • 2014-06-23
          • 2013-11-08
          • 1970-01-01
          • 2012-11-05
          • 2011-07-12
          • 2016-11-27
          相关资源
          最近更新 更多