PHP 会话(Session)实现用户登陆功能

Cookie是一种在客户端和服务器之间传递数据的机制。它是由服务器发送给客户端的小型文本文件,保存在客户端的浏览器中。每当浏览器向同一服务器发送请求时,它会自动将相关的Cookie信息包含在请求中,以便服务器可以使用这些信息来提供个性化的服务。

 

服务器发送Cookie:当服务器发送响应时,可以通过设置响应头中的Set-Cookie字段来发送Cookie。Set-Cookie字段的值是一个包含Cookie属性的字符串,例如:

Set-Cookie: name=value; Expires=Wed, 21 Oct 2022 07:28:00 GMT; Path=/
浏览器存储Cookie:一旦浏览器接收到带有Set-Cookie字段的响应,它会将Cookie保存在本地。每个Cookie都与特定的域名相关联,并且在指定的路径下有效。

浏览器发送Cookie:当浏览器向服务器发送请求时,它会自动将与该域相关的所有Cookie包含在请求头的Cookie字段中,例如:

Cookie: name=value; other_cookie=other_value
服务器使用Cookie:服务器在接收到请求后可以通过读取请求头的Cookie字段来获取客户端发送的Cookie数据,并使用它们进行个性化处理或提供特定的功能。

需要注意的是,Cookie具有一些属性,如过期时间(Expires或Max-Age),路径(Path)、域名(Domain)、安全属性(Secure)等,用于控制Cookie的行为和访问。此外,浏览器还可以为Cookie设置HttpOnly属性,使得Cookie值无法被JavaScript脚本访问,从而提高安全性。

 

每次向服务器发出请求时,本地浏览器确实会将cookie附带在请求信息中‌。这是因为cookie的工作机制决定了它们会在每次请求时被自动发送到服务器。

Cookie的工作流程和原理

  1. 生成Cookie‌:当浏览器首次向服务器发出请求时,服务器会生成一个唯一的标识符(即cookie),并通过响应头中的Set-Cookie字段发送给浏览器。这个cookie通常包含用户信息,如登录状态、个性化设置等‌1。
  2. 存储Cookie‌:浏览器收到Set-Cookie字段后,会将cookie存储在本地。存储方式可以是内存、硬盘或其他方式,具体取决于浏览器的实现‌1。
  3. 发送Cookie‌:当浏览器再次向服务器发送请求时,会自动在请求头中添加一个Cookie字段,并将所有存储在本地的cookie信息包含在内。这样,服务器就能够根据这些cookie来识别并获取用户的相关信息‌1。

Cookie的分类和存储方式

  1. 会话cookie‌:这种cookie在浏览器关闭后即失效。它们通常用于保持用户会话状态,如登录状态。
  2. 持久化cookie‌:这种cookie可以设置过期时间,在过期时间内即使浏览器关闭,cookie信息也会保存并可以在下次访问时发送给服务器。过期后,cookie将不再发送‌2。

浏览器对Cookie的控制

浏览器可以通过以下方式控制cookie的发送和接收:

  • 限制第三方cookie‌:用户可以选择是否允许第三方cookie,这影响广告跟踪和其他跨域功能。
  • 启用隐私模式‌:在隐私模式下,浏览器不会保存任何cookie,从而保护用户的隐私‌

session_set_cookie_params() 函数不管刷不刷新页面,都不会改变cookie的过期时间,

但setcookie() 函数页面每刷新一次,cookie 的过期时间就会刷新一次。

需要使用session_set_cookie_params()函数来配置session的cookie参数,是因为session的底层实现是基于HTTP cookie机制的。

HTTP cookie是服务器通过响应头设置在客户端的一种键值对,用于在客户端存储数据。当客户端向服务器发送请求时,浏览器会自动将cookie发送给服务器,以帮助服务器识别客户端身份、存储用户的偏好设置、保持用户的登录状态等。

在PHP中,session机制通过设置session ID的cookie来识别客户端身份和存储会话数据。而session_set_cookie_params()函数可以用来配置session ID的cookie参数,如过期时间、作用域、安全标志等。

底层原理是,当调用session_start()函数时,PHP会生成一个唯一的session ID,并将该ID存储在cookie中。通过session_set_cookie_params()函数可以设置cookie的参数,然后通过setcookie()函数将cookie发送给浏览器,从而使浏览器在后续的请求中自动发送该cookie

因此,通过设置session_set_cookie_params()函数可以控制session ID的cookie的过期时间、作用域、安全标志等,从而增强session的安全性和可控性。

Session储存于服务器端(默认以文件方式存储session),根据客户端提供的session id来得到用户的文件,取得变量的值,session id可以使用客户端的Cookie或者Http1.1协议的Query_String(就是访问的URL的“?”后面的部分)来传送给服务器,然后服务器读取Session的目录……。也就是说,session id是取得存储在服务上的session变量的身份证。当代码session_start();运行的时候,就在服务器上产生了一个session文件,随之也产生了与之唯一对应的一个session id,定义session变量以一定形式存储在刚才产生的session文件中。通过session id,可以取出定义的变量。跨页后,为了使用session,你必须又执行session_start();将又会产生一个session文件,与之对应产生相应的session id,用这个session id是取不出前面提到的第一个session文件中的变量的,因为这个session id不是打开它的“钥匙”。如果在session_start();之前加代码session_id($session id);将不产生新的session文件,直接读取与这个id对应的session文件。 按照上面的思想,我只要把session_id存在在cookie中就可以正常使用session了以下是session_set_cookie_params的用法
void   session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure [, bool httponly]]]] )设置与这个session相关联的session的细节

Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。

当然使用 Session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。

Session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 php.ini 的权限,默认 Session 的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。

<?php
//  表单提交后...
$posts = $_POST;
//  清除一些空白符号
foreach ($posts as $key => $value) {$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"]; $query = "SELECT `username` FROM `user` WHERE `password` = '$password' AND `username` = '$username'";
//  取得查询结果
$userInfo = $DB->getRow($query); if (!empty($userInfo)) {//  当验证通过后,启动 Sessionsession_start();//  注册登陆成功的 admin 变量,并赋值 true$_SESSION["admin"] = true;
} else {die("用户名密码错误");
}
?>

<?php
//  防止全局变量造成安全隐患
$admin = false;
//  启动会话,这步必不可少
session_start();
//  判断是否登陆
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {echo "您已经成功登陆";
} else {//  验证失败,将 $_SESSION["admin"] 置为 false$_SESSION["admin"] = false;die("您无权访问");
}
?>
<?php
session_start();
//  这种方法是将原来注册的某个变量销毁
unset($_SESSION['admin']);
//  这种方法是销毁整个 Session 文件
session_destroy();
?>

Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 Session ID。

如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PAT 甲级 1090 Highest Price in Supply Chain

构造一个二维数组 v &#xff0c;v[i] 存放指向 i 的所有元素。 构造队列 q 存放每个待读取的节点。 构造数组 high 存放每个节点的高度&#xff08;第几级经销商&#xff09; #include<iostream> #include<queue> #include<cmath> using namespace std; …

DeepSeek掘金——SpringBoot 调用 DeepSeek API 快速实现应用开发

Spring Boot 实现 DeepSeek API 调用 1. 项目依赖 在 pom.xml 中添加以下依赖: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…

算法——数学建模的十大常用算法

数学建模的十大常用算法在数学建模竞赛和实际问题解决中起着至关重要的作用。以下是这些算法的具体信息、应用场景以及部分算法的C语言代码示例&#xff08;由于篇幅限制&#xff0c;这里只给出部分算法的简要代码或思路&#xff0c;实际应用中可能需要根据具体问题进行调整和扩…

推荐几款SpringBoot项目手脚架

作为程序员、一般需要搭建项目手脚架时、都会去Gitee或Github上去找、但是由于Github在国内并不稳定、所以就只能去Gitee去上查找。 不同语言检索方式不一样、但是也类似。 Gitee WEB应用开发 / 后台管理框架 芋道源码 ELADMIN 后台管理系统 一个基于 Spring Boot 2.7.1…

智能自动化新纪元:AI与UiPath RPA的协同应用场景与技术实践

智能自动化新纪元&#xff1a;AI与UiPath RPA的协同应用场景与技术实践 引言 在数字化转型的浪潮中&#xff0c;企业对于自动化技术的需求已从简单的任务执行转向更复杂的智能决策。传统RPA&#xff08;Robotic Process Automation&#xff09;通过模拟人类操作处理重复性任务…

数据结构:动态数组vector

vector 是 C 标准库的动态数组。 在C语言中一般初学者会使用malloc&#xff0c;int[n]等方式来创建静态数组&#xff0c;但是这种方式繁琐且容易出错。我们做算法题一般使用动态数组vector&#xff0c; 并且在刷题网站的题目给的输入一般也是vector类型。 示例&#xff1a;vect…

基于深度学习的信号滤波:创新技术与应用挑战

一、引言 1.1 研究背景 随着科技的不断发展&#xff0c;信号处理领域面临着越来越复杂的挑战。在众多信号处理技术中&#xff0c;基于深度学习的信号滤波技术逐渐崭露头角&#xff0c;成为研究的热点。 基于深度学习的信号滤波在信号处理领域具有至关重要的地位。如今&#…

前端八股——JS+ES6

前端八股&#xff1a;JSES6 说明&#xff1a;个人总结&#xff0c;用于个人复习回顾&#xff0c;将持续改正创作&#xff0c;已在语雀公开&#xff0c;欢迎评论改正。

医院安全(不良)事件上报系统源码,基于Laravel8开发,依托其优雅的语法与强大的扩展能力

医院安全&#xff08;不良&#xff09;事件上报系统源码 系统定义&#xff1a; 规范医院安全&#xff08;不良&#xff09;事件的主动报告&#xff0c;增强风险防范意识&#xff0c;及时发现医院不良事件和安全隐患&#xff0c;将获取的医院安全信息进行分析反馈&#xff0c;…

H3C交换机路由器防火墙FTP/TFTP服务器搭建。

软件介绍。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多种网络服务功能的工具软件&#xff0c;主要用于网络管理和文件传输&#xff0c;支持TFTP、FTP、Syslog等多种协议&#xff0c;广泛应用于网络设备的配置和管理。 1. 主要功能 TFTP服务器&#xff1a;支持TFTP协议…

数据库连接管理--Java连接数据库的几种方式

1.数据库连接管理 1.1 使用JDBC获取连接 JDBC是Java标准库提供的API&#xff0c;用于连接和操作关系型数据库。它是最基础、最常用的数据库连接方式。 步骤&#xff1a; 加载数据库驱动。建立连接。创建Statement或PreparedStatement对象。执行SQL查询或更新。处理结果集。关…

如何使用Spring boot框架实现图书管理系统

使用 Spring Boot 框架实现图书管理系统可以按照以下步骤进行&#xff0c;涵盖了从项目搭建、数据库设计、后端接口开发到前端页面展示的整个流程。 1. 项目搭建 可以使用 Spring Initializr&#xff08;https://start.spring.io/ &#xff09;来快速创建一个 Spring Boot 项目…

【网络安全 | 漏洞挖掘】账户接管+PII+原漏洞绕过

文章目录 前言正文前言 本文涉及的所有漏洞测试共耗时约三周,成果如下: 访问管理面板,成功接管目标列出的3000多家公司。 获取所有员工的真实指纹、机密文件及个人身份信息(PII)。 绕过KYC认证,成功接管电话号码。 绕过此前发现的漏洞。 正文 在测试目标时,我发现了一…

深度学习学习笔记(34周)

目录 摘要 Abstracts 简介 Hourglass Module&#xff08;Hourglass 模块&#xff09; 网络结构 Intermediate Supervision&#xff08;中间监督&#xff09; 训练过程细节 评测结果 摘要 本周阅读了《Stacked Hourglass Networks for Human Pose Estimation》&#xf…

JVM类文件结构深度解析:跨平台基石与字节码探秘

目录 一、类文件&#xff1a;Java生态的通用语言 1.1 字节码的桥梁作用 1.2 类文件核心优势 二、类文件二进制结构剖析 2.1 整体结构布局 2.2 魔数与版本控制 2.3 常量池&#xff1a;类文件的资源仓库 2.4 访问标志位解析 三、核心数据结构详解 3.1 方法表结构 3.2 …

wps中zotero插件消失,解决每次都需要重新开问题

参考 查看zotero目录 D:\zotero\integration\word-for-windows 加载项点击 dotm即可 长期解决 把dom 复制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN还是每次都需要重新开的话 重新加载一下

如何设计合理的树状结构表:平衡查询效率与维护效率

树状结构广泛应用于数据建模中&#xff0c;例如 商品分类、组织架构、权限管理 等场景。合理设计树形结构的数据库表&#xff0c;能够有效提升 查询效率 和 维护效率。本文将探讨如何在设计时平衡这两者&#xff0c;详细介绍常用的几种树状结构存储方式及其适用场景。 一、树状…

List 接口中的 sort 和 forEach 方法

List 接口中的 sort 和 forEach 方法是 Java 8 引入的两个非常实用的函数&#xff0c;分别用于 排序 和 遍历 列表中的元素。以下是它们的详细介绍和用法&#xff1a; sort 函数 功能 对列表中的元素进行排序。 默认使用自然顺序&#xff08;如数字从小到大&#xff0c;字符…

深度学习驱动的车牌识别:技术演进与未来挑战

一、引言 1.1 研究背景 在当今社会&#xff0c;智能交通系统的发展日益重要&#xff0c;而车牌识别作为其关键组成部分&#xff0c;发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中&#xff0c;它可以用于车辆识别、交通违…

GitCode 助力至善云学:构建智慧教育平台

项目仓库&#xff1a; 前端&#xff1a;https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client 后端&#xff1a;https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server 突破传统教学困境&#xff0c;探索教育新解法 传统教学的习题讲评环节&#xff0c;教师面临着难以…