PHP 登录和 $_SESSION

Posted

技术标签:

【中文标题】PHP 登录和 $_SESSION【英文标题】:PHP login and $_SESSION 【发布时间】:2021-06-09 06:01:16 【问题描述】:

我在 php 和 js 中有一个现有的 webapp,我正在尝试向它添加身份验证。我已经弄清楚了如何创建登录页面并针对我的组织的 LDAP 服务器进行身份验证的部分,在该服务器上创建了多个用户的帐户。

我的问题是 $_SESSION 变量对于所有访问的用户都是相同的。

如果用户访问该页面,我设置

$_SESSION["username"]="xyz";
$_SESSION["logged_in"]=true;

然后如果另一个用户登录,$_SESSION 变量对他来说是全新的,还是像 "username""logged_in" 这样的键将使用前一个用户的数据设置?

如果没有,那么 PHP 或 httpd 网络服务器如何知道选项卡是否关闭或有新请求进来?

如果我在浏览器(或多个浏览器窗口)中打开多个标签页,它们的后端是否都具有相同的 $_SESSION 变量?

基本上我对$_SESSION 变量的生命周期有疑问。

【问题讨论】:

@JohnDoe 好的,您是说会话数据以某种 cookie 格式存储在浏览器端,当我们打开页面时,会读取来自浏览器的会话数据并用于填充 php 全局 $_SESSION变量? @DivyaanandSinha 这不太正确,不。请参阅下面的答案,并在此处阅读更多内容:***.com/questions/11142882/… @JohnDoe the sessions are stored in the browser...不完全是。会话 ID 由服务器发出并传递给浏览器。浏览器存储会话 ID,但不存储其余数据。与每个会话关联的其余数据安全地存储在服务器上。 【参考方案1】:

当服务器收到一个 HTTP 请求时,服务器会生成一个 Session ID 并发回给浏览器。浏览器将会话 ID 存储在 cookie 中,以便可以重复使用它。 ID 形成了浏览器和服务器之间的链接,以便服务器可以将后续请求识别为来自同一浏览器。

然后,在浏览器向同一服务器发出的每个请求中,浏览器都会将该会话 ID(在 HTTP 标头中)发送到服务器。 PHP 使用该 ID 在其存储中为该 ID 查找正确的会话数据。实际的会话数据是私有的,永远不会离开服务器。只有 ID 进入浏览器。

所有这一切意味着两个用户不可能共享相同的会话数据,因为每个会话 ID 都是唯一的。 (从技术上讲,如果他们使用不安全的仅 HTTP 连接到服务器并且您能够监控他们的网络流量,或者甚至使用 HTTPS 使用中间人攻击,那么从技术上讲,他们可以窃取其他用户的会话 ID,但这是另一个话题。)

默认情况下,如果您关闭浏览器,会话 cookie 将被销毁。因此,当您重新打开浏览器并返回同一网站时,它将发送一个没有会话 ID 的请求,并且服务器会为您提供一个新的会话 ID。

导致新会话发生的另一件事是会话在服务器上超时。服务器将有一个会话超时值。它记录会话开始的时间以及使用该会话 ID 发出最后一次请求的时间。如果在最后一个请求后的超时分钟内没有使用给定的会话 ID 发生请求,则会话 ID 将被销毁,并且浏览器将在下一次请求发生时获得一个新的会话 ID,无论它是否发送了前一个.这通常是您发现如果您几分钟不使用某个网站就会退出该网站的原因。

【讨论】:

感谢您的解释。 php 本身是否使用一些数据库或存储来跟踪会话 ID 及其相关数据?这也意味着,如果具有特定会话 id 的人访问该页面,那么 $_SESSION 变量将只包含与该人的特定 id 相关的数据,对吗? ***.com/questions/454635/… 已经回答了你的第一个问题。 是的,每个用户都有不同的会话变量 - 我在答案中提到两个用户不可能共享同一个会话。自己进行测试很容易 - 制作一个 PHP 脚本,将随机数写入会话,或者接受来自表单的用户输入并将其存储在会话中,然后在屏幕上再次输出。从您机器上的两个不同浏览器或从常规窗口和隐身窗口转到该页面 - 您会看到数据未共享。 再次感谢。 @ADyson。但是最后一个问题,您提到 ID 是从标头中检索的。如果在加载页面之前在我的前端代码中,我对具有 session_start() 和所有其他基本功能的后端 php 脚本进行简单的 jquery 调用 $.get("check_login.php"),那么 ID 是否会作为标题隐式传递在上面的 GET 请求中?我看到很多人说一开始就在网页html代码中包含了php部分,但我不想在这里混合后端和前端。 试试看很容易。这对我来说从来都不是问题——我很确定浏览器会自动附加信息。使用网络工具检查请求并查看实际发送的标头和 cookie 信息。 I have seen many people saying included the php part in the webpage HTML code itself in the beginning ...这可能是出于不同的目的。取决于您的应用程序的设计。

以上是关于PHP 登录和 $_SESSION的主要内容,如果未能解决你的问题,请参考以下文章

带备注的 头文件加载文件

PHP 登录和 $_SESSION

php怎样在首页显示登录昵称

php怎样在首页显示登录昵称

PHP $_Session ,JS在成功插入用户名和密码后不允许会员登录

PHP_AUTH_USER 和 PHP_AUTH_PW 实现登录验证