目录索引的

时间:2018-02-13 12:46:18

标签: php session authentication login directory

上下文: 我正在构建一个PHP 7 Web应用程序,它使用PHP会话登录并检查用户是否在每个页面上登录。以下是大多数页面的基本构成:

<?php session_start(); ?>
<?php include 'the_header_and_menu.php'; ?>
<p>Page content</p>
<?php include 'the_footer.php'; ?>

the_header_and_menu.php文件的顶部是session_check.php的包含,它位于网站目录之外。这个PHP过程执行五项检查,其中最基本的检查包括在内。

if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] == 'false') { // If loggedin is not set, or is false, then run this block.
    header('Location: http://example.com/index?eject=noLogin'); // Send the user to the eject page.
    die(); // Exit the process.
}

流程摘要:用户登录,创建会话及其变量。当用户加载页面时,执行会话检查以确保用户的帐户有效并且被授权。如果帐户或会话不再有效/授权,则会将用户重定向到登录页面(索引)。

问题:如果某人未登录进入http://example.com/dashboard,则会使用第一张支票(上图中显示)将其弹出。但是,如果他们输入http://example.com/process/,则检查似乎无效,并且用户会显示该页面。此页面不仅包含目录列表,而是调用http://example.com/process/index.php文件来代表它。

问题:我如何应用保护单个网页(例如dashboard.php)的相同逻辑来保护目录索引?

自己回答:

  

这里的问题很简单,但被忽视了。

     

the_header_and_menu.php文件的顶部是session_check.php的包含,它位于网站目录之外。

     

在标题和菜单文件中,会话检查包括。但是,因为会话检查位于主目录之外(就像后端的大部分一样),所以我通过相对路径引用它,类似于下面的路径。

include_once '../mainfolder/php/subfolder/sessioncheck.php';
  

但是,由于该文件已包含在子目录中,因此它应该包含另一个../运算符。

include_once '../../safe/php/users/sessioncheck.php';
  

解决方案:我现在将其包含在我想要保护的每个页面上,而不是通过标题和菜单执行会话检查。这绝不是一个完美的解决方案,只是让事情再次发挥作用。

感谢 Daniel Schmidt ,让我朝着正确的方向前进!

2 个答案:

答案 0 :(得分:1)

目录索引通常不是来自PHP - 它们由您的网络服务器(nginx,apache,...)提供服务。今天,显然没有必要启用这些索引。

看起来您并未向您发送每个请求的PHP流程。我倾向于建议检查您的网络服务器配置。

答案 1 :(得分:0)

这里的问题很简单,但被忽视了。

  

the_header_and_menu.php文件的顶部是session_check.php的包含,它位于网站目录之外。

在标题和菜单文件中,会话检查包括。但是,因为会话检查位于主目录之外(就像后端的大部分一样),所以我通过相对路径引用它,类似于下面的路径。

include_once '../mainfolder/php/subfolder/sessioncheck.php';

但是,由于该文件已包含在子目录中,因此它应该包含另一个../运算符。

include_once '../../safe/php/users/sessioncheck.php';

解决方案:我现在将其包含在我想要保护的每个页面上,而不是通过标题和菜单执行会话检查。这绝不是一个完美的解决方案,只是让事情再次发挥作用。