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