当我有用户登录时,它会重定向到此页面:
<?php
session_start();
if (isset($_SESSION['LoggedIn'])){
include "content.php";
}
else {
echo "You must be logged in.";
}
?>
我刚刚意识到,如果人们登出,没有什么能阻止他们访问 content.php 页面。是的,它不会显示太多,但是处理这个问题的正确方法是什么?
我认为您的设置倒退了。不要content.php
从检查您是否登录的页面中包含,而是content.php
包含包含检查的文件。该文件应该执行以下操作:
session_start();
if (!isset($_SESSION['LoggedIn']) {
die("You must be logged in.");
}
另一种选择是保留您当前的结构,但放在content.php
Web 根目录之外,因此无法直接使用 URL 对其进行寻址。
问题是您不应该只将一个文件/函数作为加载内容的网关。但是您需要为如何访问内容创建一个结构。所以这段代码:
<?php
session_start();
if (isset($_SESSION['LoggedIn'])){
include "content.php";
}
else {
echo "You must be logged in.";
}
?>
也许应该调整并添加到authentication.php
行为如下的文件中:
<?php
session_start();
if (!isset($_SESSION['LoggedIn'])){
echo "You must be logged in.";
die();
}
?>
逻辑基本上是:这个用户登录了吗?好,在页面的其余部分做任何其他需要发生的事情。如果没有,请回显一条阻止他们的消息并通过 退出die()
。然后在content.php
- 以及您想要限制的任何其他页面 - 您加载authentication.php
就像页面所做的第一件事一样:
<?php
require_once('authentication.php');
[...rest of `content.php` goes here...]
?>
而且你总是require_once
在你想要限制的每个页面上这样做。
限制对任何页面的访问的唯一方法是在该页面上check
授予该用户访问权限。这意味着要么添加
session_start();
if (isset($_SESSION['LoggedIn'])){
}
else {
//header redirect;
}
到每一页,或者有一个函数/配置等类型的文件来运行你需要的所有函数,并在其中包含该标题。
我建议制作一些名为 init.php 的内容,并将其包含在每个页面中。在 init.php 中你可以有上面的代码,所以你不需要 session_start() 并且每次都检查登录。请记住,如果您的函数(例如 content.php 中的数据)位于dependent
user_id 上(意味着您有一个基于登录用户的自定义页面),那么您必须在运行任何依赖于它的函数之前包含 init.php .
例如你有一个functions.php
文件
// 从 mysql 数据库中获取数据
函数say_hi() { $user_id = $_SESSION['user_id']
$sql = "SELECT * FROM users WHERE `user_id` = '".$user_id."'";
$result = $db->query($sql);
while ($rows =$chaptersResult->fetch_assoc())
{
$first_name = $rows['first_name'];
$last_name = $rows['last_name'];
$date_registered = $rows['date_registered'];
}
echo $first_name. " ".$last_name. "You registered on: ".$date_registered;
}
然后在 content.php 上,你想做一些你无法使用的事情,除非你的 inti.php(它将包含你的 $_SESSIONs 用于用户 ID 和其他东西)在你的 functions.php 之前被调用。
例如
内容.php
<?php
require_once 'init.php';
require_once 'functions.php';
echo say_hi();
?>
顺序确实很重要,随着您了解更多,您最终将拥有一个用于数据库连接等的配置文件。
在您的 else 语句中,请改用以下内容:
header("location:index.php");
基本上,您是说如果用户未登录,请将他们重定向到主页(或您指定的任何页面,如登录页面)。