PHP会话中cookie的使用

首先说到会话前,我们得知道HTTP协议是无状态的。即服务器只会“傻乎乎的”给客户端请求提供服务,不会“记忆”用户上一次做过什么,如此这般的站点交互感极差。 但是如果服务器能保存用户的浏览历史、行为习惯等等,是不是很酷。cookie就帮我们干了这个活!

cookie 是HTTP协议下,服务器或脚本可以维护客户信息的一种方式,用户在浏览器上的一个很小的文本文件。【常用来记忆 用户名、密码、个性化设置、个人偏好记录等等】
cookie 保存在客户端(用户浏览器),可以手动删除。如果浏览器上的cookie太多,超过了系统所允许的范围(通常限制为50个,每个不超过4kb),浏览器会自动删除。

一、使用setcookie函数创建cookie

我们使用setcookie函数很快就创建了一个cookie.

setcookie('name','聂哥');

如何才能知道是否创建成功?F12 或右键检查,查看【Application】=》【Storage】=>[Cookies].查看是否有刚刚创建的cookie信息。

1、设置cookie的有效时间

如上,成功创建了cookie,但是我们关闭浏览器,再访问相同地址的URL,再次查看Application里的cookie发现:cookie已经失效了。所以我们知道如上创建的cookie ,默认关闭浏览器就会失效。现在我用setcookie的第三个参数来设置有效时间,设置格式:

setcookie(key,value,time()+3600)   //有效时间3600秒
要删除一个 Cookie

应该设置过期时间为过去,以触发浏览器的删除机制

setcookie("name", "聂哥", time()-3600);

2、cookie的作用路径范围

根目录(/)
      ---- x
          ----- b.php
      ---- a.php

cookie的有效路径范围,默认的路径值是 cookie 所处的当前目录,如图的目录结构,a.php创建的cookie,默认的作用范围\,所以b.php能访问到, 然后b.php创建的cookie作用范围/x,故a.php不能访问。

setcookie(key,value,time()+3600,'/')   //cookie 将在整个域名内有效

3、cookie的作用的有效域名

如果我们在www.study.com域名下设置cookie,默认的这个cookie仅在 www 这个二级域名中有效。如果此时还有一个二级域名moblie.study.com想要和www进行共享cookie,我们 只需如下配置第5个参数

setcookie(key,value,time()+3600,'/','study.com') 

手册:设置成子域名(例如 'www.example.com'),会使 Cookie 对这个子域名和它的三级域名有效(例如 w2.www.example.com)。 要让 Cookie 对整个域名有效(包括它的全部子域名),只要设置成域名就可以了(这个例子里是 'example.com')

4、cookie与安全的https

默认值:false;设置这个 Cookie 是否仅仅通过安全的 HTTPS 连接传给客户端,设置成 true 时,只有安全连接存在时才会设置 Cookie。 如果是在服务器端处理这个需求, 我们需要仅仅在安全连接上发送此类 Cookie (可以通过 $_SERVER["HTTPS"] 判断)。

5、cookie的JavaScript访问

默认值:false;如果我们设置true;Cookie 即仅可通过 HTTP 协议访问。 这意思就是 Cookie 无法通过类似 JavaScript 这样的脚本语言访问。

要有效减少 XSS 攻击时的身份窃取行为

二、cookie的工作原理

结合上图说:当用户初次对服务器发起请求时(1.1),服务器会执行对应的脚本,比如demo.php文件,执行setcookie函数(1.2)

# demo.php
setcookie('name','niege',time()+3600);

然后服务器会在响应消息的时候在响应头里添加Set-Cookie信息,将信息cookie的形式发送给浏览器(1.3)。 如果浏览器没有禁用cookie,便会接受了服务器发送的cookie信息,就会将它保存在浏览器的缓冲区中(1.4)。 这样当浏览器继续访问该服务器,都会携带cookie发送给服务器,从而使服务器分辨出当时请求是由那个用户发出的(2.1)


三、使用cookie注意

使用cookie需要主要几个点。也算是cookie的缺点吧

  1. cookie被附加在每个http请求响应中,无形中增加了数据流量

  2. cookie在http请求中是明文传输的,所以安全性不高,容易被窃取

  3. cookie是来自浏览器的数据,可以被篡改,因此服务器接收后必须验证数据的合法性

  4. 浏览器限制cookie的数量和大小,聂哥在查了很多资料,都说chrome数量都在50左右,每个不超过4kb,但是在测试-版本 71.0.3578.98(正式版本)。明明可以创建168个,也不知道这些资料上的咋统计的!

凌晨了,很晚了,手机里突然响起了《平凡之路》,没忍住,跟着哼了起来...(/ω\)

我曾经跨过山和大海
也穿过人山人海
我曾经拥有着的一切
转眼都飘散如烟
我曾经失落失望失掉所有方向
直到看见平凡才是唯一的答案
我曾经毁了我的一切
只想永远地离开
我曾经堕入无边黑暗

想挣扎无法自拔
我曾经像你像他像那野草野花
.......