上下文: 我正在构建一个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 ,让我朝着正确的方向前进!
答案 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';
解决方案:我现在将其包含在我想要保护的每个页面上,而不是通过标题和菜单执行会话检查。这绝不是一个完美的解决方案,只是让事情再次发挥作用。