我正在尝试按如下方式实现基本会话处理:
PHP文件1 - 在对用户进行各种检查后登录 数据库中的密码等我想给这个用户一个会话
<?php
...
session_start();
PHP文件2 - 在执行文件2中的任何逻辑之前,我想看看会话中是否存在我认为会在请求 PHPSESSID 标题中存在的会话的有效会话?
<?php
$sessionID = session_id();
if ($sessionID === '') {
echo 'no session found';
} else {
echo 'session found.';
}
我试图在PHP文件2中启动一个新会话,该会话将返回一个值,但我遇到的问题是如果有人远程尝试在我的服务器上执行php文件,例如https://example.com/folder1/php/loaddata.php他们只会给予一个新的会话I并被允许执行该文件。
答案 0 :(得分:1)
您需要在文件2的session_start()
标记下添加<?php
,否则它不知道会话变量等。
虽然因为你实际上没有开始新的会话,但你只是继续现有会议,这可能会令人困惑。
让我们更多地澄清一下。会话本身不用于身份验证,它们更像是一种可以更轻松地在同一站点上跨多个网页跟踪身份验证的工具。始终检查用户数据库的身份验证。话虽这么说,一旦用户成功登录,您可以执行类似$_SESSION['logged_in'] = true
的操作,并且该会话变量仅适用于已登录的用户。然后在需要登录的页面上,您在加载页面之前测试是否设置了该会话变量,否则,重定向到登录屏幕或您想要的任何内容。那清楚了吗?
答案 1 :(得分:1)
仅仅出席会议并不意味着什么。在获得会话ID之前,您必须启动会话。 PHP的默认会话处理实际上不允许您在开始会话和恢复现有会话之间进行细粒度控制;所以每当你拨打session_start
时,这是获得“当前”会话ID所必需的,会启动会话 。这不是确定是否有人登录的有效方法。
但是,在登录系统中,您通常需要知道 谁 已登录,因此您需要在会话中存储一个值,该值指示用户是谁。只需检查该值的存在/正确性即可确定登录情况:
session_start();
if (empty($_SESSION['user'])) {
header('HTTP/1.0 401 Unauthorized');
exit;
}
答案 2 :(得分:1)
这是默认php会话机制的简化说明:
当您使用session_start();
开始会话时,会生成一个唯一的会话ID并通过会话cookie发送到客户端,因此下次该用户访问您的网站时,他可以检索其会话数据(存储在服务器上的文件),其中包含在cookie中发送给他的会话ID。
这是通过比较cookie中的会话ID和存储具有该ID的会话数据的文件的名称来完成的。
为确保只有特定用户可以访问您网站的某个区域,您需要在$_SESSION
全局变量中存储唯一值,例如:
<?php
session_start();
if (!isset($_SESSION["user"]) || $_SESSION["user"] !== 'someValue'){
echo 'not allowed';
} else {
echo 'allowed';
}
这是一个基本的例子,为了让您更安全,您需要做更多事情。您需要protect against CSRF,session hijacking/session fixation,您需要set_session_cookie_params()
仅允许使用http Cookie,以便不能使用javascript更改它们。如果您不使用 https ,最后所有这些都可以被利用,如果您确定set_session_cookie_params()
仅允许安全连接(仅限https)。
答案 3 :(得分:0)
因此,根据@ deceze,@ Difster和@blackcat的回复,我实现了以下内容:
的login.php
//start a session
session_start();
//add some session data
$_SESSION["logged_in"] = true;
$_SESSION["user"] = $userName;
session_commit();
stuff.php
session_start();
if ((isset($_SESSION["user"])) && (isset($_SESSION["logged_in"]))) {
echo ('You shall pass:'.$_SESSION["user"]);
//stuff.php logic can start
} else {
header('HTTP/1.0 401 Unauthorized');
exit;
}