从HTTP协议到PHP中的cookie 编码

 

实例脚本:

 

请求和响应:

输出:

结论:

  1. setcookie函数会对cookie的value做一次urlencode编码
  2. 客户端(浏览器)不会对cookie的value做任何转码
  3. PHP的server端在解析提交的cookie时,会对cookie的value做一次urldecode然后初始化到$_COOKIE数组中

延伸:

如果使用setrawcookie函数,对cookie的value不做urlencode,那么value中如果含有 “;”,则上行cookie的编码会是什么样的呢?(因为上行的多个cookie是靠”;”开分隔的)

测试代码:

结果:

 

结论:

1. 设置cookie时,cookie的value是需要urlencode的; 毕竟http协议中cookie的设置如下:

cookie的属性之间使用”;” 来分隔的,如果cookie的value中含有 “;” ,自然也不会当做value的一部分的

2. PHP对于上行的cookie也是做urldecode的(尽管多个cookie之间的分隔符不是”&”)

3.  从协议层不难看出,cookie名字也是不能有特殊字符的,就像value中不能函数特殊字符一样

 

PHP中setcookie的部分实现:

从上面实现,我们不难发现,cookie名字中不能含有哪些字符;而对于cookie值,如果允许编码,则允许任意字符了

 

注意

PHP中setcookie对value的编码使用的是urlencode:

1. urlencode对有些字符是不编码的,有些时候会带来不必要的麻烦

2. urlencode会将空格编码为’+’,而有些解码函数如JS中的 unescape 、decodeURIComponent 并不会将 ‘+’ 解码为空格的,于是cookie中的’hello world’,使用JS从cookie中取出后就会成为’hello+world’

针对上面两个问题,建议:

1. 自己对cookie值做rawurlencode,使用setrawcookie来设置cookie

2. 自己对cookie值做rawurlencode,使用header函数来set-cookie

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据