PHP中cookie与session使用指南
Cookie和session的出现,是为了解决http协议无状态交互的窘境,它们都用于存储客户端的相关信息
0x01 Cookie使用
简介
Cookie 是一种在客户端存储数据的机制,通常用于记录用户的状态和偏好。下面将介绍如何在 PHP 中进行 Cookie 的增、删、改、查操作。
在php中设置cookie都是使用setcookie()
函数,这个函数可以接收7个参数分别代表:
setcookie(
string $name,
?string $value = "",
?int $expire = 0,
?string $path = "",
?string $domain = "",
?bool $secure = false,
?bool $httponly = false
)
-
$name
:它定义了Cookie的名称,后续我们要使用cookie就可以使用$name
来进行访问。例如:
-
$value
:Cookie 的值,默认为空字符串。注意,如果设置为null
,在某些情况下可能会被解释为空字符串。- Cookie的值一般用来进行用户身份识别、状态跟踪、安全性控制,它是cookie机制的核心,这种能力使得网站可以在用户访问不同页面或关闭浏览器后保持特定数据的状态和持久性。
- 例如:
- 一个登录逻辑,当用户成功登录后,服务器可能会创建一个包含用户身份信息的 Cookie,并在用户的每次请求中使用该 Cookie 进行身份验证。
- 在购物车中,Cookie 可以用于存储用户的购物车内容,方便用户在不同页面或会话中保留购物车状态。
- 还有一种常见的安全机制是将 CSRF 令牌存储在 Cookie 中,以便进行跨站请求伪造的防护。
-
$expire
:Cookie 的过期时间,Unix 时间戳格式,默认为 0,表示会话级的 Cookie。设置为未来的时间戳则表示 Cookie 的过期时间。通俗的来说,它就是定义了Cookie的过期时间,当 Cookie 过期时,它不会立即被浏览器删除,而是在浏览器下一次发送请求时,服务器检测到 Cookie 已过期,于是命令浏览器删除这个过期的 Cookie。可以使用time()
当前时间戳函数来定义,- 例如:
cookie(‘user_id’,’admin’,time()+60)
,则表示 Cookie 将在当前时间的 60 秒后过期。
- 例如:
-
$path
:Cookie 有效的路径。默认为整个域名。如果设置为/
,则在整个域名下有效。也就是说这个参数可以用于控制cookie,在哪里才能生效。- 例如:
- 我修改成只有根目录下的index文件夹才能使用该cookie
- 可以发现在我创建cookie的index.php,无法访问cookie,但是在index文件夹下的cookie.php 却能正常去访问cookie。
- 例如:
-
$domain
:Cookie 有效的域名,默认为空字符串,表示当前域名。如果设置为.example.com
,则在所有子域名下有效。这个参数与path
的原理基本一致,只不过这里是设置范围是域名,需要注意的是,如果需要设置多个子域名访问同一个cookie,那么就需要设置多个cookie来实现。 -
$secure
:用于指定 Cookie 是否只在通过 HTTPS 安全协议传输时发送。设置为true
或数字1
表示仅在 HTTPS 下发送该 Cookie,而设置为false
或数字0
则表示在 HTTP 或 HTTPS 下都发送。 -
$httponly
:如果设置为true
,Cookie 将被设置为 HTTP Only,JavaScript 无法访问。当然这里也可以使用数字 1 来表示true
,使用数字 0 来表示false
。- 当HTTPonly设置为1时,
- 当HTTPonly设置为1时
增加 Cookie
使用 setcookie()
函数来添加或设置 Cookie。
// 设置 Cookie,名为 "user_id",值为 "123",有效期为一小时,作用路径为根目录
setcookie('user_id', '123', time() + 3600, '/');
删除 Cookie
通过设置 Cookie 的过期时间为过去的时间来删除 Cookie。
// 删除名为 "user_id" 的 Cookie
setcookie('user_id', '', time() - 3600, '/');
修改 Cookie
修改 Cookie 实际上是通过设置新的 Cookie 来实现的。
//修改名为 "user_id" 的 Cookie 的值为 "456",有效期为一小时,作用路径为根目录
setcookie('user_id', '456', time() + 3600, '/');
//也可以通过超全局数组来修改Cookie
$_COOKIE['user_id'] = 789
获取 Cookie
通过 $_COOKIE
超全局数组来获取已设置的 Cookie 值。
// 获取名为 "user_id" 的 Cookie 的值
$userID = $_COOKIE['user_id'];
0x02 Session使用
简介
Session 是服务器端存储用户信息的机制,用于在用户访问不同页面时保持会话状态。以下是 PHP 中使用 Session 的基本操作。
与Cookie不同的是,Session会把用户数据全部保存在服务端,然后由服务端生成以个Session-id 发送给客户端作为Cookie使用,服务端根据Session-id来判断哪一个才是用户的信息
在session中也有类似setcookie()
的配置方式,不过它是在php.ini
配置文件当中。
- session.save_handler: 定义 Session 数据的存储方式,比如使用文件系统、数据库等,默认为文件系统方式(
files
)。- session.save_path: 指定 Session 数据存储的路径或者连接字符串(如数据库连接字符串),对于文件系统方式存储的 Session 数据,默认是服务器临时目录。
- session.use_cookies: 控制是否使用 Cookie 在客户端传输 Session ID,默认为 1(开启)。
- session.name: 设置用于保存 Session ID 的 Cookie 名称,默认是 PHPSESSID。
- session.cookie_lifetime: 设置 Session ID Cookie 的生存时间,以秒为单位,默认为 0,表示会话结束后失效。
- session.cookie_secure: 设为 1 时表示只有在使用 HTTPS 连接时才发送 Session ID Cookie,默认为 0。
- session.cookie_httponly: 设为 1 时表示 Session ID Cookie 仅通过 HTTP 协议访问,JavaScript 无法访问,默认为 0。
- session.gc_probability 和 session.gc_divisor: 控制 Session 回收机制的触发概率,用于清除过期的 Session 数据。
- session.use_strict_mode: 设为 1 时表示强制使用严格模式,拒绝非安全的 Session ID。
这些选项可以在
php.ini
中配置,以控制 Session 的行为。请注意,修改php.ini
后,可能需要重启 Web 服务器才能生效。
增加 Session
使用 session_start()
开启会话并设置 Session 数据。
当使用完session_start()
会在客户端生成一个Cookie,里面的名称就是PHPSESSID
是可以在php.ini
中配置session.name
来修改,也可以通过代码来实现修改.
session_name('PHPSEID'); //修改session的名称
session_set_cookie_params(0,'/','',0.1);//类似setcookie,除了没有名称与值这两个参数,其他均与setcookie参数一致,它的作用也是修改了session的cookie参数。
session_start(); //启动session机制
$_SESSION['user1'] = 'admin'; //设置seesion中的用户信息数据
$_SESSION['user2'] = 'text';
在客户端浏览器中,会得到一个名为PHPSEID
的cookie。这个 Cookie 的值就是当前会话(Session)的 ID,它是服务器端用来识别特定会话的唯一标识符。
在服务端,我们可以设置session.save_path
来配置 session服务端的保存位置。
而在这里存储的内容就是以序列化的形成保存用户信息,在服务器端,这些序列化后的数据会以特定的文件或其他存储方式保存在对应的 Session 目录中,文件名通常以 Session ID 命名。
删除 Session
使用 unset()
或 session_destroy()
函数来删除 Session 变量或销毁整个 Session。
// 删除名为 "user_id" 的 Session 数据
unset($_SESSION['user_id']);
// 销毁整个 Session
session_destroy();
修改 Session
修改 Session 实际上是重新赋值给 Session 变量。
// 修改名为 "user_id" 的 Session 的值为 "456"
$_SESSION['user_id'] = '456';
获取 Session
通过 $_SESSION
超全局数组来获取已设置的 Session 值。
// 获取名为 "user_id" 的 Session 的值
$userID = $_SESSION['user_id'];
0x03 Cookie与Session的对比
Cookie 和 Session 都用于在 Web 开发中存储用户信息,但在存储位置、安全性和使用场景上有所不同。
Cookie与Session的对比
- 存储位置: Cookie 存储在客户端,Session 存储在服务器端。
- 安全性: 由于 Session 存储在服务器端,相对来说比 Cookie 更安全,特别是对于敏感信息。
- 用途: Cookie 更适合用于客户端的持久化存储,Session 更适合存储会话相关的数据。