PHP中cookie知识点学习


Posted in PHP onMay 06, 2018

什么是cookie

cookie,即小饼干,是保存在用户代理端(浏览器是最常见的用户代理)的一些数据片段。浏览网页时,浏览器会将 当前页面有效的 cookie放在请求的头部发送到服务端。

cookie组成

cookie由以下几部分组成:

domain,cookie所属的域名。浏览器发送cookie时,会检查cookie所属的域名,相符才会发送。浏览器会将tlanyan.me域下的cookie发送到www.tlanyan.me或者dev.tlanyan.me的页面请求中,但不会发送给www.baidu.com。同样,dev.tlanyan.me的cookie不能发送给tlanyan.me,因为限定了域名为dev子域。

path,cookie所属路径。设置为/author中的cookie不会发送到/category路径下,但是设置路径为/的cookie会发送到所有页面请求。

name, cookie的名称(键名)。

value, cookie的值(内容)。

expires,过期时间。

secure,是否仅在https时才会传送该cookie。

httponly,是否只用作http传递用。当设置为true时,浏览器端的脚本语言将无法访问到该cookie。

cookie的用途

cookie主要用在以下方面:

http是无状态的协议,为了维持会话需要额外的数据做标记,cookie是最常用的手段。常见的PHPSESSID和JSESSIONID这两类cookie,分别用在PHP和Java web应用中维持会话。

有些数据需要存放在客户端,cookie是一种选择。用户勾选“下次不再提示”后,该标志可保存到客户端,再次访问程序读取设定再决定是否显示。随着HTML 5的普及,这部分功能正慢慢被localStorage取代。

PHP端的cookie操作

读取cookie可以通过$_COOKIE超全局变量读取到用户端传来的所有cookie。$_COOKIE是一个数组,可以遍历读取发送过来的cookie的名称和值。浏览器只发送了cookie的键值到服务端,故而无法读取到cookie的domain/path/exipres等信息,因为。

PHP提供了setcookie函数来发送cookie到客户端。setcookie的函数签名是:

bool setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] )

参数与cookie的组成内容相对应: expires默认为0,表示仅当前会话有效,用户关闭浏览器后该cookie将被清除;path默认为当前页面路径,即网址最后一个反斜杠前的部分;domain默认为当前页面的域名,如果要扩大使用范围,可设置为父级域名或者顶级域名; httponly默认为false,建议设置为true避免XSS攻击。

删除cookie,只需要设置cookie的expires为过去的时间戳即可,例如 time() ? 3600。所以要删除foo这个cookie,代码可以为

setcookie('foo', '', time() - 3600);

cookie的良好实践

从cookie字面意思便可看出,保存的是数据片段。web开发中cookie使用的频率比较高,应该多加以理解。以下是一些使用cookie的良好实践:

不应该在cookie中保存过大和过多的数据;
cookie在客户端和传输中是明文可见的,不应该在cookie中保存敏感信息;
为了站点和用户安全,尽可能将cookie的httponly属性设置为true;
cookie是客户端完全控制的,也属于外部输入,服务端不可盲目相信,应对其进行过滤。
其他

cookie是随请求发送而来,随响应而设置到客户端。理解了这个过程,就可以明白一些新手常见的问题,例如以下代码:

if (!isset($_COOKIE['foo']) {
   setcookie('foo', 'foobar');
 } 
 $foo = $_COOKIE['foo'];

在未设置foo这个cookie的情况下,第5行运行会出错。原因在于setcookie是设置本次响应的cookie信息,需要浏览器接收到响应并设置后,才能在后续的请求中附带上该cookie,并没有反应到本次请求上。

同理,cookie存在于请求和响应的头部信息中,而头部应该在请求正文之前,所以setcookie的函数上下文使用限制同header函数,即:在此之前不能已经发送过响应正文。

PHP 相关文章推荐
php xml留言板 xml存储数据的简单例子
Aug 24 PHP
PHP中的按位与和按位或操作示例
Jan 27 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php中 $$str 中 "$$" 的详解
Jul 06 PHP
PHP结合Mysql数据库实现留言板功能
Mar 04 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
May 23 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
laravel手动创建数组分页的实现代码
Jun 07 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
PHP 图片合成、仿微信群头像的方法示例
Oct 25 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
分析php://output和php://stdout的区别
May 06 #PHP
PHP 布尔值的自增与自减的实现方法
May 03 #PHP
PHPExcel 修改已存在Excel的方法
May 03 #PHP
PHP中PDO事务处理操作示例
May 02 #PHP
PHP简单实现解析xml为数组的方法
May 02 #PHP
PHP实现动态压缩js与css文件的方法
May 02 #PHP
Yii2框架数据验证操作实例详解
May 02 #PHP
You might like
PHP4实际应用经验篇(2)
2006/10/09 PHP
PHP 中文处理技巧
2010/04/25 PHP
php注销代码(session注销)
2012/05/31 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
JavaScript数组各种常见用法实例分析
2015/08/04 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
2017/02/05 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
Bootstrap多级菜单的实现代码
2017/05/23 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
Javascript防止图片拉伸的自适应处理方法
2017/12/26 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
[02:03]《现实生活中的DOTA2》—林书豪&DOTA2职业选手出演短片
2015/08/18 DOTA
python 迭代器和iter()函数详解及实例
2017/03/21 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
2020/12/08 Python
美国最大的珠宝首饰网上商城:Jewelry.com
2016/07/22 全球购物
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
娇韵诗俄罗斯官方网站:Clarins俄罗斯
2020/10/03 全球购物
标记环介质访问控制协议
2016/03/27 面试题
Linux文件系统类型
2012/09/16 面试题
本科毕业生自我鉴定
2013/11/02 职场文书
烹饪自我鉴定
2014/03/01 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs