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

news/2025/2/23 14:14:34

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"><?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)) {
    //  当验证通过后,启动 Session
    session_start();
    //  注册登陆成功的 admin 变量,并赋值 true
    $_SESSION["admin"] = true;
} else {
    die("用户名密码错误");
}
?>

php"><?php
//  防止全局变量造成安全隐患
$admin = false;
//  启动会话,这步必不可少
session_start();
//  判断是否登陆
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true) {
    echo "您已经成功登陆";
} else {
    //  验证失败,将 $_SESSION["admin"] 置为 false
    $_SESSION["admin"] = false;
    die("您无权访问");
}
?>
php"><?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.niftyadmin.cn/n/5863467.html

相关文章

[漏洞篇]文件上传漏洞详解

[漏洞篇]文件上传漏洞详解 一、介绍 1. 概念 文件上传漏洞是指用户上传了一个可执行的脚本文件&#xff0c;并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的&#xff0c;“文件上传” 本身没有问题&#xff0c;有问题的是文件上传后&#xf…

【爬虫基础】第一部分 网络通讯-编程 P3/3

上节内容回顾&#xff1a;【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 前言 1.知识点碎片化&#xff1a;每个网站实现…

javaEE-SpringBoot日志

一.日志的用途 平时我们使用日志,就是通过控制台打印一些信息,或者程序运行保存,查看控制台报错原因. 随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题. ⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤…

全链路优化:如何让单点登录认证接口并发性能翻倍?

背景 最近针对一个单点登录认证项目进行性能优化&#xff0c;在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次&#xff0c;性能提升一倍&#xff0c;整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下&#xff0c;Ngi…

leetcode刷题记录(一百一十六)——5. 最长回文子串

&#xff08;一&#xff09;问题描述 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09;5. 最长回文子串 - 给你一个字符串 s&#xff0c;找到 s 中最长的 回文 子串。 示例 1&#xff1a;输入&#xff1a;s "babad"输出&#xff1a;"bab"解释&am…

Docker实战-使用docker compose搭建博客

docker run 部署 创建blog网络 [rootk8s-master ~]# docker network create blog 8f533a5a1ec65eae3f98c0ae5a76014a3ab1bf3c087ad952cdc100cc7a658948 [rootk8s-master ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8f533a5a1ec6 blog bridge …

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…