《白帽子讲Web安全》学习:深入解析Cookie与会话安全

news/2025/2/26 5:42:09

目录

导言

一、Cookie 的原理与作用

二、Cookie 面临的安全风险

三、Cookie的核心安全属性

1.Domain 属性

2.Path 属性

3.Expires 属性

4.HttpOnly 属性

5.Secure 属性

6.SameSite 属性

7.SameParty 属性

四、安全使用Cookie

1.正确设置Cookie属性值

2.Cookie前缀

3.保密性和完整性

五、会话安全

1.会话管理

(1)会话ID的随机性:

(2)过期和失效:

(3)绑定客户端:

(4)安全传输:

(5)客户端存储会话:

2.固定会话攻击

(1)攻击者获取Session ID:

(2)强制用户使用该Session ID:

(3)劫持用户会话(Session Hijacking):


导言


最近在学习吴翰清老师的《白帽子讲Web安全》,书中对Web安全的核心问题进行了系统梳理。其中Cookie与会话安全作为Web安全的基石之一,让我深刻认识到:一个看似简单的Cookie,背后可能隐藏着巨大的安全风险。本文结合书中内容和个人实践,总结Cookie与会话安全的核心知识点,并探讨如何在实际开发中规避常见漏洞。


一、Cookie 的原理与作用

首先书中先介绍了何为Cookie:Cookie 是服务器发给用户浏览器上的一小段数据,浏览器会存储这些数据,用于识别用户身份、记录用户偏好等,并在后续发往服务器的请求中带上Cookie。它就像一个随身携带的 “小账本”,在用户浏览网页的过程中,帮助服务器 “记住” 用户的相关信息,从而提供更个性化的服务。比如,当我们再次访问常逛的购物网站时,页面能自动显示我们的历史浏览记录和收藏商品,这背后离不开 Cookie 的作用。


二、Cookie 面临的安全风险

Cookie是Web应用实现用户状态管理的关键技术,常用于存储会话标识(Session ID)、用户偏好等信息。但是Cookie 的广泛应用也带来了诸多安全风险。攻击者可以通过各种手段窃取用户的 Cookie,进而伪装成用户身份,获取敏感信息或进行恶意操作。

如:

  • 跨站脚本攻击(XSS):攻击者能注入恶意脚本,在用户不知情的情况下获取其 Cookie。
  •  Cookie 窃听:在不安全的网络环境中,如公共 Wi-Fi,攻击者可以监听并截获 Cookie 数据。

Cookie的以下特性也使其成为攻击者的重点目标:

  1. 客户端存储:Cookie存储在浏览器端,可能被篡改或窃取。
  2. 自动携带:浏览器会在每次请求中自动附加Cookie,易被中间人劫持。
  3. 明文传输:未加密的Cookie可能被网络嗅探工具捕获。

三、Cookie的核心安全属性


书中介绍了cookie的一些重要属性,通过合理设置Cookie属性,可显著提升安全性:

1.Domain 属性

定义:指定了 Cookie 可以被哪些域名访问。只有当浏览器请求的域名与 Cookie 的 Domain 属性匹配时,浏览器才会在请求中包含该 Cookie。

作用:用于实现跨子域共享 Cookie。例如,设置Domain=.example.com,那么www.example.comblog.example.com等子域都可以访问该 Cookie,方便在同一域名的不同子域之间共享用户信息等。

2.Path 属性

定义:指定了 Cookie 在服务器上的路径。只有当请求的 URL 路径与 Cookie 的 Path 属性匹配时,浏览器才会发送该 Cookie。

作用:可以限制 Cookie 的访问范围。比如,设置Path=/admin,那么只有在访问/admin路径下的页面时,浏览器才会发送该 Cookie,有助于提高 Cookie 的安全性和管理效率,避免不必要的 Cookie 在不相关的路径中被发送。

3.Expires 属性

定义:指定了 Cookie 的过期时间,是一个具体的日期和时间。当浏览器到达这个时间点后,就会自动删除该 Cookie。

作用:用于控制 Cookie 的生命周期。例如,设置Expires=Thu, 01 Jan 2030 00:00:00 GMT,表示 Cookie 在 2030 年 1 月 1 日过期。如果不设置该属性,Cookie 通常在浏览器关闭时就会被删除,即成为会话 Cookie。

4.HttpOnly 属性

定义:设置了该属性的 Cookie 不能被客户端脚本(如 JavaScript)访问,只能通过 HTTP 协议由服务器进行读写操作。

作用:主要用于防止跨站脚本攻击(XSS)。攻击者无法通过脚本获取带有HttpOnly属性的 Cookie,从而降低了 Cookie 被窃取和利用的风险,提高了 Cookie 的安全性。

5.Secure 属性

定义:标记为Secure的 Cookie 只会在使用 HTTPS 协议加密的连接中发送到服务器,在 HTTP 连接中不会被发送。

作用:确保 Cookie 在传输过程中的保密性和完整性,防止 Cookie 在网络传输过程中被窃取或篡改。因为 HTTPS 对数据进行了加密,所以可以有效保护Secure属性的 Cookie 安全

6.SameSite 属性

定义:用于限制第三方 Cookie,它有三个可选值:StrictLaxNone

作用Strict模式下,Cookie 仅在同站请求时发送,跨站请求不会携带 Cookie,安全性最高;Lax模式相对宽松,允许一些安全的跨站导航请求携带 Cookie,如链接跳转等;None则允许跨站请求发送 Cookie,但需要同时设置Secure属性。该属性主要用于防止跨站请求伪造(CSRF)攻击和用户跟踪等问题。

7.SameParty 属性

定义:该属性用来标识 Cookie 是否属于同一 “party”。具有相同SameParty属性值的 Cookie 可以在跨站点的情况下共享,前提是符合相关的浏览器策略和安全机制。

作用:在一些复杂的跨站点交互场景中,比如在不同站点但属于同一组织或关联业务之间,需要共享某些用户状态或数据时,SameParty属性可以提供一种相对安全和可控的方式来实现 Cookie 的共享,同时也有助于减少跨站跟踪的风险,增强用户隐私保护。

属性名称属性值描述作用
Domain域名指定 Cookie 可以被哪些域名访问用于实现跨子域共享 Cookie
Path路径指定 Cookie 在服务器上的路径限制 Cookie 的访问范围
Expires日期时间指定 Cookie 的过期时间控制 Cookie 的生命周期
HttpOnly无(布尔值)设置该属性的 Cookie 不能被客户端脚本访问防止跨站脚本攻击(XSS)
Secure无(布尔值)标记为 Secure 的 Cookie 只会在 HTTPS 连接中发送确保 Cookie 传输安全,防止被窃取或篡改
SameSiteStrict/Lax/None限制第三方 Cookie 的发送规则防止跨站请求伪造(CSRF)攻击和用户跟踪
SameParty字符串值标识 Cookie 是否属于同一 “party”在跨站点场景下实现安全可控的 Cookie 共享,增强隐私保护

四、安全使用Cookie

书中还给出了如何安全使用Cookie的分析:

1.正确设置Cookie属性值

在Web应用中安全使用Cookie时正确设置属性值十分重要,包括:

  • 关键Cookie应设置Secure属性以确保在加密网络中传输;
  • 若无需子域名读取Cookie,植入时可不设Domain属性,若要与子域名网站共享状态需评估安全性;
  • 重要Cookie应设置HttpOnly属性,减少被客户端JavaScript读取的风险;
  • 与会话有关且不被其他站点引用的Cookie,建议设置SameSite属性为LAX,且不能依赖浏览器默认值,应在应用中显式指定 。

2.Cookie前缀

存在子域名的网站中,每个站点都可以写入一个让所有子域名都可见的Cookie,以至于每个站点都无法确定一个Cookie是不是自己写入的,如果其中的一个子域名站点存在安全漏洞,就会影响到其他的子域名站点,由此,浏览器给出了“为Cookie名称添加特定的前缀”的解决方案。
 

  •  __Host前缀:若Cookie名称含此前缀,由服务端通过Set - Cookie头或前端脚本设置时,需满足带有Secure属性、不包含Domain属性、Path属性为“/”且当前为HTTPS连接这4个条件,浏览器才会接受。它将Cookie跟域名绑定,仅限当前域名植入,对子域名无效。
  • __Secure前缀:含此前缀的Cookie,只有在带Secure属性且当前连接为HTTPS时,浏览器才会接受 ,是约束更少的弱化版本,能确保在安全连接环境下写入。主流浏览器(除IE外)支持Cookie前缀特性,为保证Cookie在安全环境传输,可加“__Secure-”前缀;子域名多且安全不受控时,关键Cookie建议加“__Host-”前缀 。

3.保密性和完整性

由于Cookie对用户是完全公开的,使用浏览器的开发者工具可以查看到,这就意味着Web服务端不能将自身的机密性数据写入Cookie。


五、会话安全

Web应用中,Cookie的本质是标识不同的访问者,并记录状态,攻击者如果窃取到一个合法的会话标识或者伪造会话标识,都相当于盗取了一个账号的身份,如果服务端管理不当,有可能造成数据泄露等问题。

1.会话管理

书中从几个方面介绍了会话的安全管理:

(1)会话ID的随机性:

会话ID(Session ID)是会话管理的核心,用于标识用户的会话状态。如果会话ID可预测或重复使用,攻击者可能通过猜测或重放攻击劫持用户会话,必须使用强随机数(如CSPRNG),避免可预测性,避免使用时间戳或用户ID拼接生成Session ID。

(2)过期和失效:

会话的过期和失效机制是防止会话固定攻击和会话劫持的关键。如果会话长期有效,攻击者可能利用泄露的Session ID劫持用户会话。

(3)绑定客户端:

绑定客户端信息(如IP地址、User-Agent)可以增加会话的安全性,防止攻击者通过窃取的Session ID在其他设备上使用。

(4)安全传输:

会话数据在传输过程中可能被窃取或篡改,因此必须确保其安全传输。

(5)客户端存储会话:

客户端存储会话数据(如JWT)可以减少服务器端的存储压力,但也带来了安全风险,服务端会话数据应存储在安全位置(如Redis、数据库),而非客户端。

2.固定会话攻击

固定会话攻击:攻击者诱导用户使用攻击者指定的Session ID,当受害者登录成功后,这个Session ID就关联了受害者的身份,相当于攻击者拥有了受害者在目标网站的身份。攻击者实现固定会话攻击的方式多种多样:

(1)攻击者获取Session ID

攻击者通过某种方式(如诱导用户访问恶意链接)获取一个有效的Session ID。

防御措施:登录成功后重新生成Session ID。

(2)强制用户使用该Session ID

攻击者诱导用户使用该Session ID登录系统。

(3)劫持用户会话(Session Hijacking):

通过XSS或网络嗅探窃取Session ID,用户登录后,攻击者利用已知的Session ID冒充用户,访问其账户。

防御:

  • 设置`HttpOnly`和`Secure`属性。
  • 使用HTTPS加密通信。
  • 定期轮换Session ID。

六、总结思考

Cookie作为Web应用中用户身份验证和状态管理的核心机制,其安全性直接影响系统的整体安全。书中指出,Cookie的客户端存储特性使其容易受到XSS、CSRF等攻击,因此必须通过设置HttpOnlySecureSameSite等属性来增强安全性。此外,会话管理中的Session ID生成、过期机制、客户端绑定和安全传输也是防御会话劫持和固定攻击的关键。通过合理配置Cookie属性、使用强随机数生成Session ID、绑定客户端信息以及强制HTTPS传输,可以有效提升Web应用的安全性。书中还强调了持续关注安全标准和团队培训的重要性,以确保开发实践符合最新的安全要求。


欢迎在评论区交流你的Cookie安全实践心得!


http://www.niftyadmin.cn/n/5868082.html

相关文章

C语言(13)------------>do-while循环

1.do-while循环的语法 我们知道C语言有三大结构,顺序、选择、循环。我们可以使用while循环、for循环、do-while循环实现循环结构。之前的博客中提及到了前两者的技术实现。可以参考: C语言(11)------------->while循…

【C/C++】理解C++内存与Linux虚拟地址空间的关系---带你通透C++中所有数据

每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本质编写的原因是我在复习过程中突然发现虚拟地址空间和C内存划分我好想有点分不清时,进行查询各类资料和整理各类文章后得出的文章&#xff…

django filter 不等于

然,我很乐意帮助你解决关于Django Filter的问题。首先,请确保你具体指的是Django的django-filter库,这是一个非常流行的第三方库,用于在Django项目中提供更复杂的搜索和过滤功能。 不等于的过滤 如果你需要在Django中使用django-…

Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案

Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案 拿了一个比较老的项目部署在本地,然后先安装依赖npm install,最后npm run serve,在run serve的时候报错:报错error:0308010C:digital envelope routines::unsupported&#xff…

【MySQL】表连接原理

目录 1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4】嵌套循环连接【5】join buffer 4、总结 1、背景 在进行sql查询时有时需要多张表的查询结果组成一个共同的结果返回,这时就用到了mysql中连接的用法,接下来就以两张表…

Maven 从下载到实战:一站式配置与使用指南

一、Maven 简介 Maven 是一款基于 POM(Project Object Model) 的 Java 项目管理工具,支持依赖管理、构建自动化、标准化项目结构等功能。其核心优势包括: 依赖管理:自动下载和管理第三方库(JAR 包&#xf…

数据中心“失宠”与AI算力争夺加剧的深度剖析与未来展望

一、案例分析:微软取消数据中心租约事件 1.1 事件回顾 2025 年2月,微软取消数据中心租约这一事件在科技行业引起轩然大波。据投行 TD Cowen 的报告显示,微软通过对供应链渠道的深入调查,发现微软已取消了总计 “数百兆瓦” 容量…

【Java项目】基于SpringBoot的【旅游管理系统】

【Java项目】基于SpringBoot的【旅游管理系统】 技术简介:采用Java技术、MySQL数据库、Spring框架实现。 系统简介:系统包括管理员、用户二个用户角色,管理员功能可以管理个人中心、用户管理、景区分类管理、景区信息管理、景区商城管理、商品…