Web 安全

网站包含多种不同类型的信息。其中一些是非敏感的,例如公共页面上显示的文本。另一些是敏感的,例如客户用户名、密码和银行信息,或内部算法和私人产品信息。

敏感信息需要受到保护,这也是 Web 安全的重点。如果这些信息落入不法分子手中,可能会被用于:

  • 通过与竞争对手分享公司的信息,使其处于竞争劣势。
  • 禁用或劫持他们的服务,再次给他们的运营造成严重问题。
  • 危及客户的隐私,使他们容易受到画像、定向、数据丢失、身份盗窃甚至经济损失的影响。

现代浏览器已经具备多项功能来保护用户的 Web 安全,但开发人员也需要遵循最佳实践并谨慎编码,以确保他们的网站安全。即使代码中存在简单的错误也可能导致漏洞,不法分子可以利用这些漏洞窃取数据并获得对服务的未经授权的控制。

本文介绍了 Web 安全,包括概念信息,以帮助您了解网站漏洞以及如何保护它们的实用指南。

安全与隐私的关系

安全与隐私是不同但密切相关的概念。了解两者之间的区别以及它们如何关联是值得的。

  • 安全是指保护私人数据和系统免受未经授权的访问。这包括公司(内部)数据以及用户和合作伙伴(外部)数据。

  • 隐私是指让用户控制其数据的收集、存储和使用方式,同时确保数据不会被不负责任地使用。例如,您应该让用户知道您正在从他们那里收集哪些数据,将与哪些方共享数据,以及将如何使用数据。用户必须有机会同意您的隐私政策,访问您存储的他们的数据,并选择删除数据。

良好的安全性是良好隐私的基石。您可以遵循我们《Web 隐私》指南中列出的所有建议,但如果您的网站不安全,攻击者仍然可以窃取数据,那么秉持诚信和拥有健全的隐私政策都是徒劳的。

浏览器提供的安全功能

Web 浏览器遵循严格的安全模型,该模型对内容、浏览器和服务器之间的连接以及数据传输实施强有力的安全措施。本节将介绍构成此模型基础的功能。

同源策略和 CORS

同源策略是 Web 的一项基本安全机制,它限制了从一个加载的文档或脚本如何与来自另一个源的资源进行交互。它有助于隔离潜在的恶意文档,减少可能的攻击向量。

通常,来自一个源的文档不能向其他源发出请求。这是有道理的,因为您不希望网站能够相互干扰并访问未经授权的数据。

但是,在某些情况下,您可能希望放宽此限制;例如,如果您有多个网站相互交互,您可以使用fetch()允许它们相互请求资源。这可以通过跨域资源共享 (CORS)来实现。CORS 是一种基于 HTTP 头的机制,允许服务器指示浏览器应该允许从其自身以外的任何源(域、方案或端口)加载资源。

HTTP 通信模型

Web 浏览器和服务器使用HTTP协议相互通信,请求资源,提供响应(例如,提供请求的资源或详细说明请求失败的原因),并为该通信提供安全功能。

传输层安全 (TLS) 通过在网络传输过程中加密数据来提供安全和隐私,它是 HTTPS 协议背后的技术。TLS 有利于隐私,因为它阻止第三方拦截传输的数据并恶意使用。

所有浏览器都正在默认要求 HTTPS;这实际上已经成为事实,因为如果没有此协议,您在 Web 上几乎无法做任何事情。

相关主题

传输层安全 (TLS)

TLS 协议是使两个联网应用程序或设备能够私密且可靠地交换信息的标准。使用 TLS 的应用程序可以选择其安全参数,这可能对数据的安全性和可靠性产生重大影响。

HTTP 严格传输安全

Strict-Transport-Security HTTP 头允许网站指定只能使用 HTTPS 访问。

证书透明度

证书透明度 (CT) 是一个开放框架,旨在防止和监控证书错误颁发。新颁发的证书被“记录”到公开运行的、通常是独立的 CT 日志中。这些日志提供了仅追加的、经过加密验证的已颁发 TLS 证书记录。

混合内容

包含使用明文 HTTP 获取的内容的 HTTPS 页面称为混合内容页面。这类页面只被部分加密,使未加密的内容容易被嗅探者和中间人攻击者访问。

弱签名算法

用于数字证书签名的哈希算法的强度是证书安全的关键要素。一些签名算法已知较弱,应在适当情况下避免使用。

安全上下文和功能权限

浏览器以不同方式控制“强大功能”的使用。这些“强大功能”包括在网站上生成系统通知、使用用户的网络摄像头访问媒体流、操作系统 GPU 和使用网络支付。如果一个网站可以不受限制地使用控制这些功能的 API,恶意开发人员可能会尝试执行以下操作:

  • 通过不必要的通知和其他 UI 功能骚扰用户。
  • 在不发出警告的情况下打开他们的网络摄像头,以监视他们。
  • 堵塞他们的浏览器/系统以制造拒绝服务 (DoS) 攻击。
  • 窃取数据或金钱。

这些“强大功能”通过以下方式进行控制:

  • 此类功能的使用仅限于安全上下文。安全上下文是windowworker,其中有充分的理由相信内容已安全传输(通过 HTTPS/TLS)。在安全上下文中,与安全的上下文通信的可能性受到限制。安全上下文还有助于防止中间人攻击者访问强大功能。

    要查看仅在安全上下文中可用的 Web 平台功能列表,请参阅限制在安全上下文中的功能

  • 这些功能的使用受用户权限系统限制:用户必须明确选择提供对此类功能的访问权限,这意味着它们不能自动使用。用户权限请求会自动发生,您可以使用权限 API查询 API 权限的状态。

  • 其他几个浏览器功能只能响应用户操作(例如点击按钮)才能使用,这意味着它们需要从适当的事件处理程序内部调用。这称为瞬时激活。有关更多信息,请参阅受用户激活限制的功能

高级安全注意事项

Web 安全的许多方面都需要在服务器端和客户端进行考虑。本节主要关注客户端安全注意事项。您可以从服务器端角度找到有用的安全摘要,其中还包括要防范的常见攻击的描述,请参阅网站安全(作为我们服务器端网站编程学习模块的一部分)。

负责任地存储客户端数据

负责任地处理数据主要涉及减少第三方 Cookie 的使用,并谨慎对待您存储和共享给它们的数据。传统上,Web 开发人员使用 Cookie 存储各种数据,攻击者很容易利用这种趋势。因此,浏览器已开始限制您对跨站点 Cookie 的操作,目标是在未来完全取消对其的访问。

您应该通过限制您依赖的跟踪活动数量和/或通过以其他方式实现所需信息的持久性来为移除跨站点 Cookie 做准备。有关更多信息,请参阅从第三方 Cookie 过渡替换第三方 Cookie

保护用户身份并管理登录

当实施涉及数据收集的安全解决方案时,特别是如果数据是敏感的(例如登录凭据),使用信誉良好的解决方案是有意义的。例如,任何有声望的服务器端框架都将具有内置功能,以防止常见的漏洞。您还可以考虑为您的目的使用专门的产品,例如身份提供商解决方案或安全的在线调查提供商。

如果您想自行开发收集用户数据的解决方案,请确保您了解所有方面和要求。聘请经验丰富的服务器端开发人员和/或安全工程师来实施系统,并确保对其进行彻底测试。使用多因素身份验证 (MFA) 提供更好的保护。考虑使用专用 API,例如Web 身份验证联邦凭证管理来简化应用程序的客户端。

以下是一些提供安全登录的其他提示:

  • 在收集用户登录信息时,强制使用强密码,以便您的用户帐户详细信息不易被猜测。弱密码是安全漏洞的主要原因之一。此外,鼓励您的用户使用密码管理器,以便他们可以使用更复杂的密码,无需担心记住它们,并且不会通过写下它们而造成安全风险。另请参阅我们关于不安全密码的文章。

  • 您还应该教育您的用户有关网络钓鱼的知识。网络钓鱼是指向用户发送一条消息(例如,电子邮件或短信),其中包含一个链接,该链接指向一个看起来像他们每天使用的网站但实际上不是的网站。该链接附带一条消息,旨在诱骗用户在该网站上输入其用户名和密码,以便攻击者可以窃取这些信息并将其用于恶意目的。

    注意:有些网络钓鱼网站可能非常复杂,难以与真实网站区分开来。因此,您应该教育用户不要信任电子邮件和短信中的随机链接。如果他们收到“紧急,您需要立即登录以解决问题”之类的消息,他们应该在新选项卡中直接访问该网站并尝试直接登录,而不是点击消息中的链接。或者他们可以打电话或发送电子邮件给您讨论他们收到的消息。

  • 通过速率限制、在一定数量的尝试失败后锁定帐户以及CAPTCHA 验证码来防范登录页面的暴力攻击。

  • 使用唯一的会话 ID 管理用户登录会话,并在一段时间不活动后自动注销用户。

不要在 URL 查询字符串中包含敏感数据

通常,您不应在 URL 查询字符串中包含敏感数据,因为如果第三方截获了 URL(例如,通过Referer HTTP 头),他们可能会窃取该信息。更严重的是,这些 URL 可以被公共网络爬虫、HTTP 代理和归档工具(例如互联网档案)索引,这意味着您的敏感数据可能会在公共可访问资源上持久存在。

使用 POST 请求而不是 GET 请求来避免这些问题。我们的文章Referer 头策略:隐私和安全问题更详细地描述了与 Referer 头相关的隐私和安全风险,并提供了缓解这些风险的建议。

注意:避免通过 GET 请求在 URL 中传输敏感数据也有助于防范跨站请求伪造重放攻击

强制执行使用策略

考虑使用 Web 平台功能,例如内容安全策略 (CSP) 和权限策略,以在您的网站上强制执行一套功能和资源使用规则,从而更难引入漏洞。

CSP 允许您添加一层安全性,例如,只允许从特定的受信任来源加载图像或脚本。这有助于检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击。这些攻击涉及一系列恶意活动,包括数据窃取、网站篡改和恶意软件分发。

权限策略以类似的方式工作,只不过它更关注允许或阻止访问特定的“强大功能”(如前所述)。

注意:此类策略对于维护网站安全非常有用,特别是当您在网站上使用大量第三方代码时。但是,请记住,如果您阻止第三方脚本依赖的某个功能,您最终可能会破坏网站的功能。

维护数据完整性

在上一节的基础上,当您允许在您的网站上使用功能和资源时,您应该尝试确保资源未被篡改。

相关主题

子资源完整性

子资源完整性 (SRI) 是一项安全功能,它使浏览器能够验证它们获取的资源(例如,来自CDN)是否在没有意外篡改的情况下交付。它的工作原理是允许您提供一个加密哈希,获取的资源必须匹配该哈希。

HTTP Access-Control-Allow-Origin

Access-Control-Allow-Origin 响应头表示是否可以将响应与来自给定的请求代码共享。

HTTP X-Content-Type-Options

X-Content-Type-Options 响应头是服务器用来指示在 Content-Type 头中声明的 MIME 类型不应更改并且必须遵循的标记。此头是选择退出 MIME 类型嗅探的一种方式,换句话说,是指定 MIME 类型是经过有意配置的。

清理表单输入

通常,不要相信用户在表单中输入的任何内容。在线填写表单既复杂又繁琐,用户很容易输入不正确的数据或格式错误的数据。此外,恶意人员擅长在表单字段中输入特定的可执行代码字符串(例如,SQL 或 JavaScript)。如果您不小心处理此类输入,它们可能会在您的网站上执行有害代码或删除您的数据库。有关这种情况如何发生的良好示例,请参阅SQL 注入

为了防止这种情况,您应该彻底清理输入到表单中的数据:

  • 您应该实施客户端验证,以便在用户输入格式错误的数据时通知他们。您可以使用内置的 HTML 表单验证功能来完成此操作,也可以编写自己的验证代码。有关更多信息,请参阅客户端表单验证
  • 在应用程序 UI 中显示用户输入时,您应该使用输出编码,以安全地显示用户输入的原始数据,并避免将其作为代码执行。有关更多信息,请参阅输出编码

您不能仅仅依靠客户端验证来确保安全性——它应该与服务器端验证结合使用。客户端验证通过提供即时验证反馈而无需等待往返服务器来增强用户体验。然而,恶意方很容易绕过客户端验证(例如,通过关闭浏览器中的 JavaScript 来绕过基于 JavaScript 的验证)。

任何信誉良好的服务器端框架都将提供验证表单提交的功能。此外,一个常见的最佳实践是转义构成可执行语法部分的任何特殊字符,从而使输入的任何代码不再可执行并被视为纯文本。

防范点击劫持

点击劫持攻击中,用户被诱骗点击一个执行与用户预期不同的操作的 UI 元素,这通常会导致用户的机密信息传递给恶意第三方。这种风险是嵌入式第三方内容固有的,因此请确保您信任嵌入到您网站中的内容。此外,请注意点击劫持可以与网络钓鱼技术结合使用。您可以在上一节保护用户身份和管理登录中阅读有关网络钓鱼的内容。

以下功能可以帮助防范点击劫持:

HTTP X-Frame-Options

X-Frame-Options HTTP 响应头可用于指示浏览器是否应该被允许在 <frame><iframe><embed><object> 中渲染页面。网站可以使用此功能来避免点击劫持攻击,通过确保其内容不嵌入到其他网站中。

CSP: frame-ancestors

HTTP Content-Security-Policy (CSP) 的 frame-ancestors 指令指定了可以使用 <frame><iframe><object><embed> 嵌入页面的有效父级。

实用安全实施指南

要获取在网站上有效实施安全功能并确保遵循最佳实践的全面说明,请参阅我们的实用安全实施指南

其中一些指南与HTTP Observatory工具直接相关。Observatory 对网站进行安全审计,并提供等级和分数以及修复其发现的安全问题的建议。这些指南解释了如何解决 MDN Observatory 测试发现的问题:该工具会链接到每个问题的相关指南,帮助您找到有效的解决方案。有趣的是,Mozilla 的内部开发团队在实施网站时会使用这些指南,以确保应用了安全最佳实践。

另见