-- 第一方Cookie与第三方Cookie --
- 区分第一方cookie:用户当前访问的网站所使用的cookie 第三方cookie:用户当前访问的网站所嵌入/跨站访问的第三方网站所使用的cookie(跨站与跨域不同)
- 区别: 浏览器会接受/第一方cookie,但会根据不同的隐私策略(如SameSite)阻止部分第三方cookie的接收/发送
-- Cookie属性 --
Domain
- 作用: 指定Cookie在哪些域名中生效, 即在访问哪些域名时浏览器会发送这个Cookie以及哪些域名的网页可以通过js访问这个Cookie
- 设置限制 若不指定Domain, 生效范围仅限于当前域名 若指定,则对指定的域名及其所有子域名生效 (可指定为当前域名或当前域名的父域名, 但不能指定为当前域名的子域名
(否则浏览器拒绝写入)
) - 风险: 显式的指定Domain会导致指定的域名的子域名也可访问, 且Domain属性不包含端口信息, 即其它子域名的应用或其它端口可访问该cookie, 也能写入特定名称的Cookie, 从而干扰当前应用, 让它读到错误的Cookie(比如固定会话攻击)
Path
- 作用: 指定Cookie的生效路径, 即访问这个路径及其子路径时, 浏览器才会发送cookie以及js可以访问cookie, 若不设置, 则默认值为当前路径
- 风险: 同域名的页面1若用
<iframe>
嵌入页面2, 则可在页面1访问path为页面2的cookie, 所以用path来隔离cookie也存在风险, 更安全的做法是将不同应用部署到不同域名或子域名下, 这样就无法相互访问彼此的cookie解决方案
将不同的应用部署在不同的网站, 防止一个应用的漏洞威胁另一个应用
Expires
- 作用: 指定Cookie的有效期(时间戳)
- 特点: 若没有设置Expires或设置为0(临时Cookie), 则默认关闭浏览器后自动删除 (可有些浏览器拥有打开上一次浏览的网页功能, 为保持流畅可能不会删除临时cookie, 而实际上变为永久cookie)(待定)
- 风险:
- 即使设置有效期, 浏览器并不能保证它在有效期之内不会被删除, 因为浏览器对每个站点有最大cookie数量的限制, 若超过会删除旧cookie, 所以若存在可向受害者植入cookie的漏洞(如csrf), 攻击者可植入多个cookie, 挤掉受害者的正常的cookie
- 即使设置有效期, 访问者也可任意修改expires属性, 并不能依赖expires属性来设置会话的有效期 应在服务端在时间到期后删除session数据 或 标记一个SessionID无效
HttpOnly
- 作用: 让Cookie只能用于http/https传输, 而前端js无法读取, 一定程度上防御了xss(也无法通过前端js设置httponly的)
-
xss绕过:
- 某些框架的调试信息或报错信息会展示HTTP请求头内容(如phpinfo()), 若配合xss漏洞, 还是可以获得HttpOnly属性的Cookie
- XST, 即通过XMLHttpRequest想服务端发起TRACE请求, 即可获取Cookie内容, 然后再配合xss漏洞(现在很难奏效, 因为新版本浏览器基本都不支持XMLHttpRequest中使用TRACE方法, 而且支持TRACE方法的服务器也不多)
- 中间件漏洞: Apache 2.2.x http请求头长度超过所允许的最大值时, 会返回400页面并包含所有请求头信息, 通过xss生成一个超长的cookie, 再通过XMLHttpRequest访问服务器, 即可读取httponly的cookie
- 总结: xss读取httponly的cookie要借助服务器的其它漏洞 输出相关cookie内容到前端
Secure
- 作用: 让Cookie只在HTTPS请求中发送给服务器, 确保了不会以明文传输 (也无法用前端js和http设置secure, 可通过前端js读取)
SameSite
- 作用: 指示是否可在跨站请求中发送该cookie(即作为第三方cookie时是否会被拦截), 一定程度上防御了csrf
- 选项
- None: 不拦截(使用该选项时, 会要求必须带上Secure属性)
- LAX(默认): 部分拦截
- Strict: 全部拦截 (由于过于严格, 真实网站很少使用)
--- | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
链接 | <a href="..."></a> |
发送 Cookie | 发送 Cookie | 不发送 | ||||||
预加载 | <link rel="prerender" href="..."/> |
发送 Cookie | 发送 Cookie | 不发送 | ||||||
GET 表单 | <form method="GET" action="..."> |
发送 Cookie | 发送 Cookie | 不发送 | ||||||
POST 表单 | <form method="POST" action="..."> |
发送 Cookie | 不发送 | 不发送 | ||||||
iframe | <iframe src="..."></iframe> |
发送 Cookie | 不发送 | 不发送 | ||||||
AJAX | $.get("...") |
发送 Cookie | 不发送 | 不发送 | ||||||
Image | <img src="..."> |
发送 Cookie | 不发送 | 不发送 |
SameParty
- 使用场景:若一个企业有多个不同站点,那么使用Lax也仍过于严格
- 作用:服务端可将多个网站定义成一个可信站点集合(定义在 /.well-known/集合名 文件中),当集合之间站点跨站访问时会带上有SameParty属性的第三方cookie(不论SameSite的值是什么)
- 特点: 暂时只有chrome支持