cookie中path路径探讨

cookie中path路径探讨,第1张

上篇文章 中说:cookie必须在 同一网站 下且 cookie的path路径为当前url或者是当前url的父级 时才是共享的。

具体怎么理解呢?看下面解释

首页介绍下php中设置cookie的函数setcookie()

需要注意的且常用的有俩点

做几个测试就知道了,主要测试以下几点

设置一个cookie变量a,以我们上面的预测,客户端的path应为 /

看到path为 /, 也就是说在整个域名内任何path的cookie都应该能访问该cookie变量a

设置一个cookie变量b,以我们上面的预测,该cookie变量b的path应为/api/test,而且应该包含path为/api/test,/api和/的cookie变量,也就是包含我们上面设置的cookie变量a

发现path确实/api/test,证明我么的第一个观点,而发现能共享cookie变量a,也证明了我们的第二个观点。

cookie的几个属性:

expire:cookie的生存期,默认是暂时存储

path:cookie的关联网页,默认是当前目录的网页或者当前目录下的字子目录

domain:设置共享cookie的域名(同一主域名下)切将path设为PATH='/'

secure属性:在https协议下生效,才会传递到服务器端,http协议不会传递。

HttpOnly属性:无法通过脚本程序(js)读取到cookie信息,有效防止XSS攻击。

安全性:出于安全方面的考虑,只有与创建 cookie 的页面处于同一个目录或在创建cookie页面的子目录下的网页才可以访问

同域情况:让这个设置的cookie 能被其他目录或者父级的目录访问的方法:

document.cookie = "userName = 独行冰海path=/"

相同主域不同二级域名的跨域情况:

document.cookie = "username=独行冰海path=/domain=baidu.com"

chrome限制js设置cookie,IE可在本地JS设置cookie

A站点通过script src标签的跨站请求B站点如果请求数据是img 则不会带cookie等数据

如果请求数据是一个get请求地址,则cookie会随请求发出(此时cookie是B站点cookie)

根据这个特性我们可以构造CSRF攻击

实验截图

Cookie限制:

(1)cookie个数限制

IE :原先为20个,后来升级为50个

Firefox: 50个

Opera:30个

Chrome:180个

Safari:无限制

当Cookie数超过限制数时浏览器的行为:IE和Opera会采用LRU算法将老的不常使用的Cookie清除掉,Firefox的行为是随机踢出某些Cookie的值。当然无论怎样的策略,还是尽量不要让Cookie数目超过浏览器所允许的范围。

(2) 浏览器所允许的每个Cookie的最大长度(localstorage为5M)

Firefox和Safari:4079字节

Opera:4096字节

IE:4095字节

(3) 服务器中Http请求头长度的限制。Cookie会被附在每次http请求头中传递给服务器,因此还会受到服务器请求头长度的影响。

看个实际生活的例子:

学校门口有家饭店味道不错,小明去吃了一次,确实味道不错,这周小明又去这家饭店吃饭,结账时,小明说:”我上周来过,这是第二次了,能不能打个折?“。老板说:”你来过?我不记得啊(无状态)“。小明表示很生气,明明来过老板竟然不记得。老板想了个法子,给小明发了张卡片(cookie),上面写着小明的信息,下次小明拿着卡片来老板就认识了。

回到正题,cookie用在http请求中,而http是无状态协议,它的每个请求都是完全独立的,服务端无法判别用户状态,cookie用来告诉服务端用户的状态信息。客户端用户第一次发送请求给服务端时,服务端在返回的响应中发给用户一个cookie,里面记录了用户的信息,下次用户再发送http请求给服务端时,会携带上cookie,服务端检查cookie获取用户的状态信息。

cookie的内容主要是服务端写入的,由客户端存储在本地,cookie其实是以字符串的形式存储的。打开谷歌开发者工具的Application中的Cookie,可以看到cookie具有以下字段

cookie以键值对的形式存储用户数据

不同域名是无法 *** 作彼此cookie的,而且必须满足path一样或者是其子路径才能相互访问彼此的cookie。

domain用来设置可以使用cookie的域名,如果想让一级域名下的两个二级域名都能使用cookie,例如imag.baidu.com和www.baidu.com,可以设置domain为baidu.com,但不能设置为.com,这样两个二级域名都能使用。path属性设置允许使用cookie的路径,例如设置为根路径"/",表示允许根路径以及根路径下的所有子路径都可以使用cookie

所以domain和path共同决定了cookie能否被浏览器自动添加到请求头部中发送出去。如果没有设置这两个选项,则会使用默认值。domain的默认值为设置该cookie的网页所在的域名,path默认值为设置该cookie的网页所在的目录。

此外,如果是跨域请求,例如XMLHttpRequest请求,默认是不会自动携带cookie的。

cookie的过期时间,Expires是具体日期,Max-Age是一段时间

cookie的大小,一般是4k,此外cookie的个数也有限制,不同浏览器cookie的个数限制不同

该cookie数据是否只用来在http请求中传递,默认为false,如果设置该字段为true,客户端无法用js访问或者 *** 作该cookie,这条cookie信息不会出现在document.cookie的字符串中。

默认为false,设置该字段为true则该cookie不会携带在http协议的请求中,只能携带在安全的https协议请求中

当网页要发http请求时,浏览器会先检查是否有相应的cookie,有则自动添加在request header中的cookie字段中。这些是浏览器自动帮我们做的,而且每一次http请求浏览器都会自动帮我们做。这个特点很重要,因为这关系到“什么样的数据适合存储在cookie中”。

因为每次浏览器发送http请求都会自动携带cookie,会增加网络开销,所以最好只存放每次请求都需要发送给服务端的数据,比如身份认证信息。

客户端使用js设置 cookie,客户端可以设置cookie 的下列选项:expires、domain、path、secure(有条件:只有在https协议的网页中,客户端设置secure类型的 cookie 才能成功),但无法设置HttpOnly选项。document.cookie可以获取cookie字符串,也可以设置cookie。

document.cookie="age=12expires=Thu, 26 Feb 2116 11:50:25 GMTdomain=sankuai.compath=/"

值得注意的是,浏览器提交Cookie时只会提交name和value属性,maxAge属性只被浏览器用来判断Cookie是否过期。

当要设置多个cookie时,必须重复设置document.cookie = "key=name"。

要想修改一个cookie,只需要重新赋值就行,旧的值会被新的值覆盖。但要注意一点,在设置新cookie时,path/domain这几个选项一定要旧cookie 保持一样。否则不会修改旧值,而是添加了一个新的 cookie。删除一个cookie 也挺简单,也是重新赋值,只要将这个新cookie的expires 选项设置为一个过去的时间点就行了。但要注意,path/domain/这几个选项一定要旧cookie 保持一致。

服务端的response header中有一项叫set-cookie,是服务端专门用来设置cookie的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7731520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存