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的工作流程和原理
- 生成Cookie:当浏览器首次向服务器发出请求时,服务器会生成一个唯一的标识符(即cookie),并通过响应头中的
Set-Cookie
字段发送给浏览器。这个cookie通常包含用户信息,如登录状态、个性化设置等1。 - 存储Cookie:浏览器收到
Set-Cookie
字段后,会将cookie存储在本地。存储方式可以是内存、硬盘或其他方式,具体取决于浏览器的实现1。 - 发送Cookie:当浏览器再次向服务器发送请求时,会自动在请求头中添加一个
Cookie
字段,并将所有存储在本地的cookie信息包含在内。这样,服务器就能够根据这些cookie来识别并获取用户的相关信息1。
Cookie的分类和存储方式
- 会话cookie:这种cookie在浏览器关闭后即失效。它们通常用于保持用户会话状态,如登录状态。
- 持久化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 生存期的角色。