什么是浏览器Cookie?
Cookie是由Web服务器在用户访问网站时发送到浏览器的文本文件。浏览器将这些数据保存在设备上,并在后续向该站点发出的每个请求中将其发送回服务器。这样网站就能识别用户身份,使浏览体验更加流畅。
让我们仔细看看哪些数据会进入Cookie。
首先是关于用户在网站上的操作和会话参数的信息:点击、访问的页面、在网站上停留的时间、语言、地区、添加到购物车的商品、个人资料设置(如主题)等。这还包括有关设备的数据:型号、操作系统和浏览器类型。
用户的登录凭据和安全令牌也会被收集,用于识别身份并简化登录过程。虽然不建议将此类信息存储在Cookie中,但这种情况确实会发生,例如当用户勾选"记住我"时。如果安全令牌被放置在JS脚本可访问的Cookie中,它们可能会变得易受攻击。
另一个重要的信息类型是会话ID:这是访问网站时分配给用户的唯一代码。这是会话劫持攻击的主要目标,因为它允许攻击者冒充用户。值得注意的是,会话ID可以存储在Cookie中,如果用户禁用了Cookie,它甚至可以直接写入页面URL。
除了上述信息,Cookie还可以保存一些主要的个人数据,例如电话号码、地址甚至银行卡详细信息。它们还可能无意中存储用户在网站上输入的机密公司信息,包括客户详细信息、项目信息和内部文档。
Cookie的主要类型
按存储时间分类
Cookie通常根据存储时间长短分为两类:临时性和持久性。
临时性或会话Cookie在访问网站期间使用,并在离开后立即删除。它们使用户无需在同一个站点的每个新页面上重新登录或重新选择语言和地区设置。在单个会话期间,这些值存储在Cookie中,因为它们确保对账户的无间断访问以及网站功能对注册用户的正常运行。
持久性Cookie与临时性Cookie不同,即使用户离开网站也会保留。网站所有者会为它们设置一个过期日期,通常最长一年。但是,用户可以通过清除浏览器Cookie随时删除它们。这些Cookie通常用于存储登录凭据、电话号码、地址或支付详细信息。它们也用于广告以确定用户偏好。
按来源分类
根据来源,Cookie分为第一方和第三方。前者由网站创建和存储,后者由其他网站创建。
第一方Cookie通常用于使网站正常运行并识别用户身份。但是,它们也可以执行分析或营销功能。
第三方Cookie由用户正在访问的网站与之通信的其他网站创建。这些Cookie最常见的用途是广告横幅。例如,在网站上放置横幅广告的公司可以使用第三方Cookie来跟踪用户行为:点击广告的次数等。分析服务如Google Analytics或Yandex Metrica也使用这些Cookie。
社交媒体Cookie是另一种属于此类别的Cookie。这些由小部件和按钮设置,例如"分享"或"点赞"。它们处理与社交媒体平台的任何交互,因此可能会存储用户的登录凭据和用户设置以加快这些交互速度。
按重要性分类
另一种对Cookie分类的方法是将它们分为必需和可选两类。
必需或基本Cookie对于网站的基本功能或提供用户特别请求的服务是必要的。这包括在单次访问期间跟踪用户活动的临时Cookie。它还包括安全Cookie,例如网站用于识别用户和发现任何欺诈活动的身份验证Cookie。
使用基本Cookie的需求主要适用于具有复杂结构和各种小部件的网站。想想需要一个购物车和支付系统的电子商务网站,或者必须将图像保存到用户设备的照片应用程序。
存储在必需Cookie中的关键数据是上述会话ID,它帮助网站识别用户。如果不允许将此ID保存在Cookie中,某些网站会将其直接放在页面的URL中。这是一种风险更高的做法,因为URL未加密。它们对分析服务、跟踪工具甚至同一网络上的其他用户都是可见的,这使得它们容易受到跨站脚本(XSS)攻击。
可选Cookie是那些用于营销、分析和性能跟踪用户在线行为的Cookie。此类别包括由社交媒体平台创建的第三方Cookie,以及帮助网站运行更快并在服务器之间平衡负载的性能Cookie。
特殊类型的Cookie
让我们重点介绍通过两种类似技术管理的特殊子类型的Cookie,这些技术实现了非标准的存储和检索方法。
超级Cookie是一种跟踪技术,将Cookie嵌入网站头部,并将它们存储在非标准位置,例如HTML5本地存储、浏览器插件存储或浏览器缓存中。因为它们不在通常的位置,简单地清除浏览器的历史记录和Cookie无法摆脱它们。
从隐私的角度来看,超级Cookie是一个主要问题。它们是一种持久且难以控制的跟踪机制,可以在未经用户同意的情况下监控用户活动,这使得选择退出变得困难。
另一种不寻常的跟踪方法是Evercookie,一种僵尸Cookie。即使用户删除了Evercookie,也可以通过JavaScript恢复。恢复过程依赖于唯一的用户标识符(如果可用),以及存储在所有可能的浏览器存储位置中的Cookie痕迹。
Cookie使用的监管
Cookie的收集和管理受世界各地不同法律的约束。让我们回顾一下全球实践中的关键标准。
- 欧盟的《通用数据保护条例》(GDPR)和《电子隐私指令》(Cookie法):根据欧盟法律,基本Cookie不需要用户同意。这为一些网站创造了一个漏洞。用户可能点击"拒绝所有",但该按钮可能只拒绝非必要Cookie,允许其他Cookie仍然被收集。
- 巴西的《个人数据保护总法》(LGPD):该法律规范巴西境内用户数据的收集、处理和存储。它很大程度上受到GDPR原则的启发,并且同样要求用户免费、明确和清晰地同意使用其个人数据。
- 美国的《加州消费者隐私法案》(CCPA):CCPA将Cookie视为个人信息的一种形式。这意味着它们的收集和存储必须遵循某些规则。
- 英国的《隐私和电子通信条例》(PECR):PECR规定,网站在两种情况下只能在用户设备上保存信息:当这对于网站运行或提供服务绝对必要时,或者用户已明确同意此事。
- 俄罗斯的《联邦个人数据法》第152-FZ号:该法律广泛地将个人数据定义为任何直接或间接与个人相关的信息。由于Cookie可能属于此定义范围,因此它们可以受该法律监管。
会话劫持方法
如上所述,包含会话ID的Cookie极其敏感。它们是网络犯罪分子的主要目标。在现实世界的攻击中,已经记录了不同的窃取会话ID的方法。这种做法被称为会话劫持。下面,我们将看几种会话劫持类型。
会话嗅探
窃取带有会话ID的Cookie的一种方法是会话嗅探,这涉及拦截用户和网站之间的流量。对于使用开放HTTP协议而不是加密流量的HTTPS的网站来说,这种威胁是一个问题。使用HTTP时,Cookie在HTTP请求的头部中以纯文本形式传输,这使得它们容易被拦截。
跨站脚本(XSS)
跨站脚本(XSS)利用网站代码中的漏洞将恶意脚本(通常用JavaScript编写)注入其网页。然后,每当受害者访问该站点时,该脚本就会运行。
会话固定
在会话固定攻击中,攻击者诱骗用户的浏览器使用预定的会话ID。因此,攻击者为在受害者访问网站并执行身份验证后拦截会话数据奠定了基础。
跨站请求伪造(CSRF)
与会话固定或嗅探攻击不同,跨站请求伪造(CSRF或XSRF)利用网站对用户浏览器的信任。攻击者在用户不知情的情况下强制用户的浏览器在用户已登录的网站上执行不需要的操作——例如更改密码或删除数据。
中间人(MitM)攻击变种
中间人(MitM)攻击是指网络犯罪分子不仅窥探还将受害者的所有流量通过自己的系统重定向,从而获得读取和更改正在传输的数据的能力。这些攻击的例子包括DNS欺骗或创建看起来合法的虚假Wi-Fi热点。在MitM攻击中,攻击者成为用户和网站之间的中间人,这使他们能够拦截数据,例如包含会话ID的Cookie。
可预测的会话ID
网络犯罪分子并不总是必须窃取用户的会话ID——有时他们可以猜出来。如果会话ID是按照使用弱非加密字符的可预测模式创建的,他们就可以推断出用户的会话ID。
Cookie投掷
这种攻击方法利用了浏览器对由单个域的子域设置的Cookie的处理。如果恶意行为者控制了一个子域,他们可以尝试操纵更高级别的Cookie,特别是会话ID。
如何保护自己和用户
Cookie安全的主要责任在于网站开发人员。现代现成的Web框架通常提供内置防御,但每个开发人员都应了解Cookie配置的具体细节以及粗心方法的危险。为了应对我们讨论的威胁,以下是一些关键建议。
给Web开发者的建议
客户端和服务器之间的所有流量必须在网络连接和数据交换级别进行加密。我们强烈建议使用HTTPS并强制从HTTP自动重定向到HTTPS。为了增加额外的保护层,开发人员应使用HTTP严格传输安全(HSTS)头部,该头部强制浏览器始终使用HTTPS。
必须提到的是,使用HTTPS不足以防御XSS攻击。HTTPS在传输过程中加密数据,而XSS脚本直接在用户的HTTPS会话中的浏览器内执行。因此,网站所有者有责任实施针对XSS攻击的保护。
对于会话固定等攻击,一个关键的防御措施是强制服务器在用户成功登录后立即生成新的会话ID。网站开发人员必须使旧的、可能已泄露的会话ID失效,并创建一个攻击者不知道的新会话ID。
额外的保护层涉及检查Cookie属性。为了确保保护,有必要检查特定标志的存在(如果缺少则设置它们):Secure和HttpOnly。Secure标志确保Cookie通过HTTPS连接传输,而HttpOnly防止浏览器访问它们,例如通过脚本,有助于保护敏感数据免受恶意代码侵害。
注意另一个安全属性SameSite,它可以限制Cookie传输。将其设置为Lax或Strict用于所有Cookie,以确保它们仅在跨站请求期间发送到受信任的Web地址,并防止CSRF攻击。
为了防止网络犯罪分子试图猜测用户会话ID的攻击,您需要确保这些ID是真正随机且不可预测的。我们建议使用密码学安全的随机数生成器,该生成器利用强大的算法来创建难以预测的ID。
防止Cookie投掷攻击的最有效方法是使用带有__Host-前缀的Cookie。这些Cookie只能设置在请求来源的同一域上,并且不能指定Domain属性。这保证了主域设置的Cookie不能被子域覆盖。
最后,对所有子域执行定期安全检查至关重要。这包括监控可能被攻击者劫持的非活动或过时的DNS记录。我们还建议确保任何用户生成的内容安全地隔离在自己的子域上。
如上所述,如果禁用了Cookie,会话ID有时可能会在网站URL中暴露。为了防止这种情况,网站开发人员必须将此ID嵌入到无法拒绝的基本Cookie中。
给用户的提示
保持警惕和注意是保护自己免受Cookie劫持和其他恶意操纵的重要部分。
始终确保您访问的网站使用HTTPS。您可以通过查看浏览器地址栏中网站地址的开头来检查这一点。一些浏览器允许用户查看额外的网站安全详细信息。
在浏览网页时,始终注意浏览器给出的任何安全警告,特别是关于可疑或无效证书的警告。看到这些警告之一可能是MitM攻击的迹象。如果看到安全警告,最好停止正在做的事情并立即离开该网站。
我们还建议定期清除浏览器数据(Cookie和缓存)。这有助于摆脱过时或可能已泄露的会话ID。
在任何可用的地方始终使用双因素身份验证。这使得恶意行为者即使获取了您的会话ID,也很难访问您的账户。
当网站请求您同意使用Cookie时,最安全的选择是拒绝所有非必要的Cookie,但我们要重申,有时,点击"拒绝Cookie"仅意味着拒绝可选的Cookie。如果此选项不可用,我们建议查看设置,仅接受严格必要的Cookie。
避免点击可疑链接的普遍建议在防止会话ID被盗的背景下尤其相关。如上所述,可疑链接可用于所谓的会话固定攻击。仔细检查URL:如果它包含您不理解的参数,我们建议手动将链接复制到地址栏中,并在加载页面之前删除参数。合法URL参数中的长串字符可能被证明是攻击者的会话ID。删除它会使链接安全。
此外,我们建议在连接到公共Wi-Fi网络时格外小心。中间人攻击经常通过开放网络或恶意Wi-Fi热点发生。如果需要使用公共网络,切勿在没有虚拟专用网络(VPN)的情况下使用,VPN会加密您的数据,并使任何人几乎无法窥探您的活动。