热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP不得不提的session与cookie

session与cookie属于一种会话控制技术。常用在身份识别,登录验证,数据传输等。举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠。这时候,我们怎么识别这个会员卡真实有效的呢?

session 与 COOKIE 是什么?

session 与 COOKIE 属于一种会话控制技术。常用在身份识别,登录验证,数据传输等。举个例子,就像我们去超市买东西结账的时候,我们要拿出我们的会员卡才会获取优惠。这时候,我们怎么识别这个会员卡真实有效的呢?当我们将会员号给到收银员,收银员根据我们提供的会员号,输入到系统中,系统根据这个会员号去查询,如果查询到了就证明这个会员号是真实存在的。这里的会员号就好比 COOKIE 与 session. 会员系统就好比服务器端,收银员就好比客户端.

为什么会用到 session 与 COOKIE 呢?

根据上述的例子,我们知道 session 与 COOKIE 是可以干什么的了,那为什么必须用这个来实现呢?这里就有必要了解一下 http 应用传输协议的特点了。由于 http 协议是无状态的,即浏览器去请求了一个网页,这时候就是一个 http 请求,当服务端接收到请求之后,返回客户端需要的数据,在这过程中浏览器与服务器是建立了一个连接的。但是当服务端返回数据,客户端收到数据之后,他们的这种连接关系就断开了。下次浏览器再去发送请求的时候,又是重新建立一个连接,这两个链接没有任何关系。试想一下,当我们登录一个商场系统的时候,进入首页做了登录操作,但是我们下单或者加入购物车的时候,还需要登录,每访问一个页面就要登录,是不是很繁琐同时也是很不科学的,万一我们加入购物车的商品,我们点击下单了,下单页面要登录而且还无法正确的反馈出你下单时的那些商品.

Http 特点

1.http 协议支持客户端 / 服务端模式,也是一种请求 / 响应模式的协议。

2. 无连接。所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。限制每次的连接只处理一次请求。从而节省传输时间。

3. 无状态。http 协议对事务的处理没有记忆能力。也就意味着如果需要前面的信息,只能重传,这无形之中增加数据的传输量。这种方式某种方面上讲解放了服务器,但是却不利于客户端与服务器的连接。为了弥补这种不足,产生了两项记录 http 状态的技术,一个叫做 COOKIE, 一个叫做 Session,后面我们再细讲它们。

4. 简单快捷:所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问

5. 灵活:这里主要指的是客户端可以通过 http 协议传输任意类型的数据。比如传输.jpg 文件、.ppt 文件等等,只需要设定 content-type 就可以进行传输。

COOKIE

COOKIE 的基本概念

COOKIE 是远程浏览器存储数据以此追踪用户和识别用户的的机制,从实现来说,COOKIE 是存储在客户端上的一个数据片段。

COOKIE 的运行原理与存储机制

. 运行原理

1. 客户端向服务端发起一个 http 请求.

2. 服务端设置一个创建 COOKIE 的指令,响应给客户端.

3. 客户端收到服务端响应的指令,根据指令在客户端创建一个 COOKIE.

4. 挡下一次请求时,客户端携带这个 COOKIE 向服务端发送请求.

. 存储机制

总的来说,COOKIE 在客户端存储的形式有三种,不同的浏览器的存储机制不同,存的 COOKIE 也不同.

1. 文件存储。浏览器会针对不同的域,在磁盘的对应目录创建一个单独的文件,来存储该域下面的 COOKIE 值.

2. 内存存储。当浏览器关闭时,该 COOKIE 随之消失。根据下面的创建语法,当我们未设置过期时间时则会出现这种情况.

3.flash 存储。这种存储方式是永久存储在磁盘中,即使通过浏览器删除一些数据都是无法删除该方式存储的 COOKIE,如果需要删除,可能通过磁盘的方式.

COOKIE 的设置

Bool setCOOKIE(string $name[, string $values, $expire=0[,string $path[,string $domain[, bool $secure = false[, bool $httpOnly= false]]]]] );

$name:COOKIE存储的名称,必填选项.

$values:COOKIE存储的值。这里需要注意的是,当把该值设置为false时,客户端会尝试删除这个COOKIE值,因此在要将值这是为true或者false的时候,我们用另外的值来代替,例如true用1代替,false用0来代替.

$expire:COOKIE的过期时间,秒为单位,当该值被设置时,定时删除;当该值没有设置时,该值是永久有效的.该值设置为小于当前时间时,会出发浏览器的删除机制,会自动删除COOKIE.

$path:COOKIE有效的目录,默认的目录是"/",即表示当前的正个域名都生效.

$domain:COOKIE的作用域名,默认的是当前域名有效,如果需要设置直接填写生效的域名即可.需要注意的是IE浏览器有长度限制,当只有大于5的时候才会生效.

$secure:COOKIE的加密处理,当设置为true的时候,需要使用HTTPS协议,才会生效.

$httpOnly:决定COOKIE是否只使用http协议,当设置为1或者true,其他非http协议是无法操作COOKIE的。例如我们未设置的时候,我们Javascript是可以对COOKIE进行设置的.这样一定程度上保证了安全性.这种情况需考虑浏览器是否支持该配置项.

. 设置 COOKIE 的函数还有 setrawCOOKIE () 函数,只不过该函数不会对值 进行 urlencode 序列号.

. 有时候,我们可能遇到这种情况,我们在这个页面设置了 COOKIE,但是去刷新页面获取 COOKIE,按理说是会获取到 COOKIE 的,但实际情况是无法获取到,这是由于 COOKIE 运行机制导致,PHP 创建了 COOKIE 这个指令,告诉浏览器,你需要执行这个指令了,这时候浏览器才会去执行这个指令,因此是无法获取到 COOKIE 的.

. 在设置 COOKIE 之前,不能有任何输出.

// 实现方式一
setCOOKIE($COOKIE,"hello,world!", 3600);
// 实现方式二
header("header("Set-COOKIE: testCOOKIE=中文; path=/; domain=.sunphp.org; expires=".gmstrftime("%A, %d-%b-%Y %H:%M:%S GMT",time()+9600));");
// 两则的作用是一样的,setCOOKIE是PHP内置函数,是对http协议的操作封装。

COOKIE 的获取

$_COOKIE['$cookeName'];

COOKIE 的应用

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

COOKIE 跨域设置

我们都知道,在前端开发中时常会遇到 ajax 跨域问题,我们解决的方式有很多种,可以参考这篇文章传送门 1,传送门 2,COOKIE 跨域我们可以参考 p3p 传输协议传送门

COOKIE 使用的注意事项

. 数量限制,客户端对每一个 domian 下的 COOKIE 是有数量限制的,不是创建任意数量就行.

. 安全性,根据上面的创建语法,我们可以得知,当我们未设置 $httpOnly 值得时候,非 http 协议是可以操作 COOKIE 的值的,例如 Javascript 通过 COOKIE ($COOKIEName). 而且一些抓包工具也是可以抓取到 COOKIE 的,还有就是 COOKIE 存储在客户端的文件中,如果获取到这个 COOKIE,也是可以对 COOKIE 做一些操作的。为了防止别人可以拷贝 COOKIE 文件,进行恶意操作,可以对 COOKIE 进行加密处理.

数据传输:当 COOKIE 数量很多,数据很大的时候,其实对于带宽是有消耗的。比较 http 传输都需要带宽,当 http 传输的数据量大了,带了的带宽消耗就大.

Session

运行原理与存储机制

. 运行原理

1. 客户端向服务端发起请求,建立通信

2. 服务端根据设置的 session 创建指令,在服务端创建一个编号为 sessionid 的文件,里面的值就是 session 具体的值 (组成部分 变量名 | 类型 : 长度:值).

3. 服务端将创建好的 sessionid 编号响应给客户端,客户则将该编号存在 COOKIE 中 (一般我们在浏览器存储的调试栏中会发现 COOKIE 中有一个 PHPSESSID 的键,这就是 sessionid,当然这个名称,我可以通过设置服务端是可以改变的).

. 当下一次请求时,客户端将这个 sessionid 携带在请求中,发送给服务端,服务端根据这个 sessionid 来做一些业务判断.

. 存储机制

1. 存储方式.session 默认是文件存储的。我们可以通过 php.ini 的配置来设置存储驱动传送门

2. 生命周期。当我们未设置 session 的生命周期时,当浏览器关闭之后存储在客户端的 phpsessid 自动消失,因为它是存在内存,下次建立连接的时候会重新创建一个 phpsessid. 之前的 session,PHP 会自动的根据垃圾回收机制自动删除。这里我们可以根据 session_set_COOKIE_params ($expire) 函数来设置一个生命周期;

session 的设置

session_start();
$_SESSION = $values;

. session_start () 设置之前,不能有任何输出

session 的获取

$_SESSION['values'];

session 的删除

// 只是单纯的给重新赋了一个空的值
$_SESSION['values'] = '';
// 该函数是清空所有的session,慎用!
session_destroy();
// 连values这个session键都会删除
unset($_SESSION['values']);

session 的使用场景

. 用户身份识别

. 数据传输

. 登录控制 (是否登录、单点登录)

session 的注意事项

. 安全性,sessionid 是按照一定的算法生成,要保证 session 的值唯一性和随机性.

. 客户端禁用 COOKIE,根据上面 session 的运行原理可以得出,session 的存储于传送还是依赖于客户端,因此当客户端禁用 COOKIE 时,客户端是无法保存 PHPSESSID 的,这时候可以通过 url 重写或者表单来实现 session 的传输.

. 存储优化,按照上面的 session 创建,所有的 session 都会创建在一个目录下面,同时有的无效 session 在垃圾回收机制时间内还不会删除,当一台服务器配置的站点较多时,这时候会生成很多的 session 文件,导致我们读取速度变慢,我们可以设置 session 的存储目录级别,save_path 函数. 一般大型的项目 (如分布式的项目), 可以使用其他的存储方式,如数据存储,内存存储.

session 与 COOKIE 的区别

. session 存储在服务端,COOKIE 存储在客户端.

.COOKIE 的创建指令由服务端设置.

.session 的 sessionid 需要客户端存储.

COOKIE 与 session 的几个误区

. 客户端禁止 COOKIE,session 无法使用?

使用url重写或者表单提交可以实现.

.session 和 COOKIE 的安全性比较,session 存在客户端安全更高?

由于COOKIE是存在客户端的,相对来说安全性是要低一些,不过在创建的时候可以设置$httpOnly值.

由于COOKIE与session是相互关联的,获取到COOKIE一定程度上获取到了session,同样可以操作session.

.COOKIE 与 session 是不是在浏览器关闭的时候会消失?

这需要查看存储机制了。COOKIE可以存文件,内存,flash.存内存当然浏览器关闭则消失了;session由于垃圾回收机制,当在垃圾回收机制内是不会删除的,除非你代码中显示的做了删除操作.

.COOKIE 是存储在客户端中,如何增加其安全性?

我们可以在设置COOKIE的时候,增加一些特殊参数,如客户端信息ip、浏览器信息等.

. 当 COOKIE 存在客户端的文件中,是不是每个浏览器获取到这个文件都可以进行操作?

要看浏览器之间对COOKIE的管理机制是不是一样.


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
author-avatar
mobiledu2502884213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有