category
网站包含几种不同类型的信息。其中一些是非敏感的,例如公共页面上显示的副本。其中一些是敏感的,例如客户用户名、密码和银行信息,或者内部算法和私人产品信息。
敏感信息需要得到保护,这是网络安全的重点。如果这些信息落入坏人之手,可能会被用来:
- 通过与竞争对手共享信息,使公司处于竞争劣势。
- 禁用或劫持他们的服务,再次导致他们的操作出现严重问题。
- 将客户的隐私置于危险之中,使他们容易受到分析、定位、数据丢失、身份盗窃甚至经济损失的影响。
现代浏览器已经有几个功能来保护用户在网络上的安全,但开发人员也需要谨慎地采用最佳实践和代码,以确保他们的网站是安全的。即使是代码中的简单错误也会导致漏洞,坏人可以利用这些漏洞窃取数据并控制他们没有授权的服务。
本文介绍了网络安全,包括有助于您了解网站易受攻击的方面以及如何保护网站的信息。
安全与隐私的关系
安全和隐私是不同的主题,但它们也密切相关。了解两者之间的区别以及它们之间的关系是值得的。
- 安全是保护私有数据和系统免受未经授权的访问的行为。这包括公司(内部)数据以及用户和合作伙伴(外部)数据。
- 隐私是指赋予用户控制其数据的收集、存储和使用方式的权利,而不是不负责任地使用数据。例如,你应该清楚地与网站的用户沟通你正在收集的数据,与谁共享数据,以及如何使用数据。用户必须有机会同意您的隐私政策,可以访问您存储的他们的数据,如果他们不再希望您拥有这些数据,则可以删除他们的数据。
良好的安全性对良好的隐私至关重要。您可以遵循我们的网络隐私指南中列出的所有建议,但如果您的网站不安全,攻击者无论如何都可能窃取数据,那么诚信行事和制定强有力的隐私政策是徒劳的。
浏览器提供的安全服务
Web浏览器有一个严格的安全模型,它强制执行良好的基本内容、连接和传输安全级别。本节介绍基本知识。
同源政策和CORS(Same-origin policy and CORS)
同源策略是web的一种基本安全机制,它限制从一个源加载的文档或脚本如何与另一个源的资源交互。它有助于隔离潜在的恶意文档,减少可能的攻击媒介。
一般来说,来自一个来源的文件不能向其他来源提出请求。这是有道理的,因为你不希望网站之间相互干扰,访问不应该访问的东西。在某些情况下放松这一限制是有意义的;例如,您可能有多个相互交互的站点,并且您可能希望这些站点相互请求资源,例如使用fetch()。
这可以使用跨来源资源共享(CORS)来允许,这是一种基于HTTP标头的机制,允许服务器指示浏览器应该允许加载资源的任何来源(域、方案或端口),而不是它自己的来源。
用于通信的HTTP模型
HTTP协议被网络浏览器和服务器用来相互通信、请求资源、提供响应(例如,提供请求的资源或详细说明请求失败的原因),并为该通信提供安全功能。
传输层安全性(TLS)通过在网络传输过程中加密数据来提供安全性和隐私性,是HTTPS协议背后的技术。TLS有利于隐私,因为它可以阻止第三方拦截传输的数据并恶意使用。
所有浏览器都在默认情况下要求HTTPS;事实上已经是这样了,因为没有这个协议,你就无法在网络上做很多事情。
相关主题:
传输层安全性(TLS)
传输层安全性(TLS)协议是使两个联网应用程序或设备能够私下且稳健地交换信息的标准。使用TLS的应用程序可以选择其安全参数,这会对数据的安全性和可靠性产生重大影响。本文概述了TLS以及在保护内容安全时需要做出的各种决定。
HTTP严格的传输安全性
Strict Transport Security:HTTP标头允许网站指定只能使用HTTPS访问它。
证书透明度
证书透明度是一个开放的框架,旨在防止和监控证书的错误颁发。新颁发的证书被“记录”到公共运行的、通常是独立的CT日志中,这些日志只维护已颁发TLS证书的附加、加密保证的记录。
混合内容
包含使用明文HTTP获取的内容的HTTPS页面称为混合内容页面。像这样的页面只进行了部分加密,使嗅探器和中间人攻击者可以访问未加密的内容。本页介绍了作为一名web开发人员应该注意的事项。
弱签名算法
数字证书签名中使用的哈希算法的强度是证书安全性的关键因素。本文提供了一些关于已知较弱的签名算法的信息,因此您可以在适当的时候避免使用它们。
安全的上下文和功能权限
浏览器以几种不同的方式控制几个“强大功能”的使用。所谓“强大的功能”,我们指的是网站生成系统通知、使用用户的网络摄像头访问媒体流、操纵系统GPU和使用网络支付等。如果一个网站可以不受限制地使用控制这些功能的API,恶意开发者可能会:
- 使用不需要的通知和其他UI功能惹恼用户。
- 屏蔽他们的浏览器/系统以创建拒绝服务(DoS)攻击。
- 窃取数据或金钱。
这些浏览器功能的控制方式如下:
首先,只有在安全的情况下才允许使用此类功能。安全上下文是一个窗口或工作者,对其内容已安全传递(通过HTTPS/TLS)有合理的信心。在安全的环境中,与不安全的环境进行通信的潜力是有限的。安全的上下文还有助于防止中间人攻击者访问浏览器的强大API。
注意:另请参阅仅限于安全上下文的功能。此参考列出了仅在安全环境中可用的web平台功能。
其次,这些功能的使用是在用户权限系统之后进行的——用户必须明确选择提供对这些功能的访问,这意味着这些功能不能自动使用。用户权限请求自动发生,但您可以使用权限API查询API权限的状态。
第三,许多其他浏览器功能只能在响应用户操作(如单击按钮)时使用,这意味着它们需要从适当的事件处理程序内部调用。这通常被称为瞬态激活。有关详细信息,请参阅由用户激活的功能。
客户端开发人员的安全注意事项
需要在服务器端和客户端端考虑web安全的许多方面。以下各节主要关注客户端安全注意事项。您可以在网站安全(我们的服务器端网站编程学习模块的一部分)中从服务器端的角度找到有用的安全摘要,其中还包括需要注意的常见攻击的描述。
负责任地存储客户端数据
负责任地处理数据在很大程度上涉及减少第三方cookie的使用,并小心存储和与他们共享的数据。传统上,网络开发人员使用cookie来存储各种数据,攻击者很容易利用这一趋势。因此,浏览器已经开始限制你对跨站点cookie的使用,目的是在未来完全取消对它们的访问。
您应该通过限制您所依赖的跟踪活动的数量和/或通过其他方式实现所需的信息持久性,为删除跨站点cookie做好准备。有关详细信息,请参阅从第三方cookie转换和替换第三方Cookie。
保护用户身份并管理登录
在实施涉及数据收集的安全解决方案时,特别是在数据敏感(如登录凭据)的情况下,使用备受尊敬的提供商提供的信誉良好的解决方案是有意义的。例如,任何值得尊敬的服务器端框架都将具有内置功能,以防止常见漏洞。您也可以考虑使用专门的产品,例如身份提供商解决方案或安全的在线调查提供商。
如果您想推出自己的收集用户数据的解决方案,请确保了解所有方面和要求。聘请经验丰富的服务器端开发人员和/或安全工程师来实现系统,并确保对其进行彻底测试。使用多因素身份验证(MFA)提供更好的保护。考虑使用专门的API(如Web身份验证或联合凭据管理)来简化应用程序的客户端。
以下是提供安全登录的其他一些提示:
- 收集用户登录信息时,请强制使用强密码,这样就不会轻易猜测用户的帐户详细信息。弱密码是安全漏洞的主要原因之一。此外,鼓励用户使用密码管理器,这样他们就可以使用更复杂的密码,不必担心记住它们,也不会因为写下来而带来安全风险。另请参阅我们关于不安全密码的文章。
- 您还应该对用户进行网络钓鱼方面的教育。网络钓鱼是指向用户发送一条消息(例如,电子邮件或短信),其中包含指向一个网站的链接,该网站看起来像他们每天使用的网站,但实际上并非如此。该链接附带一条消息,旨在诱骗用户在网站上输入用户名和密码,从而使其被盗,然后被攻击者用于恶意目的。
- 注意:有些网络钓鱼网站可能非常复杂,很难与真正的网站区分开来。因此,你应该教育你的用户不要相信电子邮件和短信中的随机链接。如果他们收到一条类似“紧急,您需要立即登录以解决问题”的消息,他们应该直接转到新选项卡中的网站,尝试直接登录,而不是单击消息中的链接。或者他们可以给你打电话或发电子邮件,讨论他们收到的信息。
- 通过速率限制、在一定次数的尝试失败后锁定帐户以及CAPTCHA挑战,保护登录页面免受暴力攻击。
- 使用唯一的会话ID管理用户登录会话,并在用户处于非活动状态后自动注销。
不在URL查询字符串中包括敏感数据
一般来说,你不应该在URL查询字符串中包含敏感数据:如果第三方拦截了URL(例如通过Referer HTTP头),他们可能会窃取这些信息。更严重的是,这些URL可以通过公共网络爬网程序、HTTP代理和存档工具(如互联网存档)进行索引,这意味着您的敏感数据可以持久存在于公共可访问的资源上。
使用POST请求而不是GET请求来避免这些问题。我们的文章Referer标头策略:隐私和安全问题更详细地描述了与Referer标头相关的隐私和安全风险,并提供了减轻这些风险的建议。
注意:避免通过GET请求在URL中传输敏感数据也有助于防止跨站点请求伪造和重放攻击。
强制执行使用策略
考虑使用内容安全策略(CSP)和权限策略等工具在您的网站上强制执行一组功能和资源使用,从而更难引入漏洞。
CSP允许您添加一层安全性,例如,允许仅从特定的可信来源加载图像或脚本。这有助于检测和减轻某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击。这些攻击涉及一系列恶意活动,包括数据盗窃、网站污损和恶意软件分发。
权限策略的工作方式类似,只是它更关心允许或阻止访问特定的“强大功能”(如前所述)。
注意:这样的策略对于确保网站安全非常有用,尤其是当你在网站上使用大量第三方代码时。但是,请记住,如果您阻止使用第三方脚本所依赖的功能,您可能最终会破坏网站的功能。
维护数据完整性
继上一节之后,当您确实允许在您的网站上使用功能和资源时,您应该尽量确保资源没有被篡改。
相关主题:
子资源完整性
子资源完整性(SRI)是一种安全功能,使浏览器能够验证其获取的资源(例如,从CDN)是否在没有意外操作的情况下交付。它的工作原理是允许您提供一个提取的资源必须匹配的加密哈希。
HTTP访问控制允许来源
Access Control Allow Origin响应标头指示该响应是否可以与来自给定来源的请求代码共享。
HTTP X内容类型选项
X-Content-Type-Options响应HTTP标头是服务器用来指示不应更改和遵循Content-Type标头中公布的MIME类型的标记。这是一种选择不进行MIME类型探查的方式,或者换句话说,就是说MIME类型是故意配置的。
消毒表单输入
一般来说,不要相信用户在表单中输入的任何内容。在线填写表格既复杂又乏味,用户很容易输入错误的数据或格式错误的数据。此外,恶意人员精通将可执行代码的特定字符串输入表单字段(例如,SQL或JavaScript)的技术。如果你不小心处理这些类型的输入,它可能会在你的网站上执行有害代码或删除你的数据库。有关如何发生这种情况的一个好例子,请参阅SQL注入。
为了防止这种情况发生,您应该彻底清除输入表单的数据:
- 当用户以错误的格式输入数据时,应实现客户端验证以通知用户。您可以使用内置的HTML表单验证功能来完成此操作,也可以编写自己的验证代码。有关详细信息,请参阅客户端表单验证。
- 在应用程序UI中显示用户输入时,应使用输出编码,以安全地显示与用户键入的数据完全相同的数据,避免将其作为代码执行。有关详细信息,请参见输出编码。
但是,您不能仅依靠客户端验证来实现安全性。它对用户来说是一种有用的用户体验增强,因为它可以为用户提供即时验证反馈,而无需等待往返服务器。同时,恶意方很容易绕过客户端验证(例如,通过关闭浏览器中的JavaScript来绕过基于JavaScript的验证),因此应将其与服务器端验证相结合。
任何信誉良好的服务器端框架都将提供验证表单提交的功能。此外,一种常见的最佳实践是转义构成可执行语法一部分的任何特殊字符,从而使任何输入的代码不再可执行,并被视为纯文本。
防止点击劫持
在点击劫持中,用户被欺骗点击执行与用户期望不同的操作的UI元素。这可能是嵌入的第三方内容固有的风险(确保您信任嵌入到您的网站中的内容),也可能与网络钓鱼相结合。
以下功能有助于防止点击劫持:
- HTTP X框架选项
X-Frame-Options HTTP响应标头可用于指示是否应允许浏览器在<Frame>、<iframe>、<embed>或<object>中呈现页面。网站可以通过确保其内容不嵌入其他网站来避免点击劫持攻击。
- CSP:框架祖先
HTTP内容安全策略(CSP)框架祖先指令指定可以使用<frame>、<iframe>、<object>或<embed>嵌入页面的有效父级。
See also
- Privacy on the web
- Website security
- Mozilla security blog
- Mozilla observatory
- OWASP Cheat Sheet series — a series of detailed documents on different security topics, including how to protect against different types of vulnerability.
- Mozilla web security cheat sheet
- 登录 发表评论