2022年的8大JavaScript 安全漏洞

2022 年的 Javascript 安全漏洞

最常见的 JavaScript 漏洞包括跨站点脚本 (XSS)、恶意代码、中间人攻击和利用 Web 应用程序源代码中的漏洞。这些可以通过在开发过程中扫描您的代码中的漏洞并教育您的开发人员有关安全性来防止。

与几乎任何编程语言一样,JavaScript 并非没有潜在的安全风险。利用 JavaScript 漏洞可以操纵数据、重定向会话、修改和窃取数据等等。尽管 JavaScript 通常被认为是客户端应用程序,但 JavaScript 安全问题也会在服务器端环境中产生问题。

对常见 JavaScript 安全漏洞的最佳防御是了解它们并实施适当的控制以减少暴露。

在本文中,我们将了解最常见的 JavaScript 漏洞,以及如何通过流行的现代安全方法结合测试工具(例如,审计和代码分析工具、JavaScript漏洞扫描器等)来预防它们。

什么是 JavaScript 安全性?

JavaScript 安全与调查、预防、保护和解决使用 JavaScript 的应用程序中的安全问题有关。

JavaScript 本身是构建 Web 应用程序的基础技术,并且在构建服务器端、桌面甚至移动应用程序方面也非常流行。然而,它的广泛流行也使其成为黑客的主要目标,并希望通过各种攻击媒介将其作为目标。由于 JavaScript 主要用于前端,因此首先关注浏览器中的 JavaScript 安全问题是有意义的。

软件供应商也认识到了这些 JavaScript 安全问题,对 JavaScript 安全扫描软件和各种 JavaScript 安全测试工具做出反应,使应用程序更加安全,大大降低 JavaScript 安全风险。

常见的 JavaScript 漏洞有哪些?

最常见的 JavaScript 攻击媒介包括:执行恶意脚本、窃取用户已建立的会话数据或从浏览器的 localStorage 中窃取数据、诱骗用户执行意外操作、利用 Web 应用程序源代码中的漏洞。

当然,这份清单绝不是详尽无遗的。相反,它更侧重于 Web 应用程序的前端方面。

8个 JavaScript 安全漏洞


1. 源代码漏洞

通常,源代码漏洞可能与其他(甚至是多个)JavaScript 安全漏洞结合在一起。不幸的是,在这种情况下,使用单个 JavaScript 混淆无法阻止或隐藏这些类型的漏洞。由于 JavaScript 是一种解释型语言,而不是一种编译型语言,因此使用这种方法几乎不可能保护应用程序代码不被潜在黑客检查。尽管如此,混淆仍然是一种很好的做法,因为它会减慢黑客进行逆向工程尝试的速度。

源代码中安全漏洞的另一个原因是公共包和库的广泛使用。NPM是 JavaScript 生态系统的主要参与者,在其注册表中提供了超过一百万个包。虽然提供的种类繁多无疑是一个优势,但这也意味着这些安装在 Web 应用程序项目中的软件包中可能存在大量隐藏漏洞。

此外,即使是最简单的任务,开发人员也经常安装包,从而扩展了他们的项目依赖关系。这当然会导致安全问题并产生其他深远的后果

虽然监控和解决所有潜在的应用程序依赖漏洞可能既费时又费力,但审计工具可以帮助实现自动化,从而加快流程。

防止源代码中的 JavaScript 安全问题的多管齐下的方法应包括:

  • 提高开发人员对最佳实践的认识
  • 正确审核应用程序代码以检测潜在漏洞
  • 编写单元测试不仅可以确保代码按预期运行,而且可以安全地执行
  • 实施工具以动态扫描应用程序并识别第三方包和库中的 JavaScript 安全问题

2. 意外的脚本执行

大多数意外脚本执行攻击都涉及跨站点脚本 (XSS)。与 JavaScript 相关的一个特别关注点是它与网页上的文档对象模型 (DOM) 交互的方式,允许脚本在网络上的客户端计算机上嵌入和执行。因此,虽然存在几种不同类型的 XSS 攻击,但它们的共同点是它们会导致不受信任的脚本出现并在用户的浏览器中运行。

最基本的 XSS 攻击场景之一经常出现在论坛网站上,用户可以在页面上看到彼此的消息。如果 HTML 或 JavaScript 在作为消息的一部分时未正确编码,则可能会使不道德的用户在论坛中发布以下内容:

发布这样的脚本会使每个最终用户成为受害者,通过简单地运行应用程序,无意中促成了攻击,恶意代码似乎是网页的一部分。虽然上述代码是无害的,但现实生活中的黑客当然可以发布更危险的代码。

为了防止 XSS 攻击,开发人员在处理来自服务器的用户输入和输出时,应该应用清理——转义、过滤和验证字符串数据的组合。

3. 转义/编码用户输入

XSS 攻击依赖于提供包含某些特殊字符的数据,这些特殊字符在网页的底层 HTML、JavaScript 或 CSS 中使用。当浏览器呈现网页并遇到这些字符时,它会将它们视为网页代码的一部分,而不是要显示的值。这就是允许攻击者突破文本字段并提供执行的额外浏览器端代码的原因。

为了防止这种情况,任何时候浏览器提供的数据将在响应中返回(无论是立即反映还是从数据库中检索),这些特殊字符都应该替换为这些字符的转义码。

例如,用于分隔 HTML 实体的 < 和 > 字符可以替换为 < >,它告诉浏览器显示这些字符而不是将它们解释为 HTML 实体。如果在 JavaScript 上下文中返回浏览器提供的数据,则应使用 xNN 对非字母数字字符进行转义,其中 NN 是字符的十六进制 ASCII 值。

4.过滤输入

在某些情况下,最好从作为输入接收的数据中简单地删除危险字符。这可以提供某种程度的保护,但不应单独依赖它来防止数据操纵。攻击者可以使用多种技术来规避此类过滤器。

5.输入验证

只要有可能,应验证浏览器提供的输入以确保它只包含预期的字符。例如,电话号码字段应该只允许包含数字,并且可能包含破折号或括号字符。应立即拒绝包含超出预期集的字符的输入。应设置这些过滤器以查找可接受的字符并拒绝其他所有字符。

6. 仅依赖客户端验证

虽然上面讨论的所有方法都很好并且在浏览器中运行良好,但黑客可能会使用特殊工具将数据直接发送到服务器,从而避免客户端验证。这将允许将潜在的恶意或未经验证的数据输入服务器。如果没有额外的服务器端验证,存储的数据可能会损坏或被错误数据替换。

防止此类情况的推荐最佳实践是实现客户端和服务器端验证。这种方法降低了不良数据的风险,同时仍然在客户端提供验证功能,从而为最终用户改善结果。

仅服务器验证可能会给用户带来麻烦,因为它可能需要多次填写在线表格,然后才能通过所有验证。JavaScript 验证应该用于立即通知用户他们的输入有问题,而服务器验证确保只有预期的数据才能进入应用程序。

7.窃取会话数据

客户端浏览器脚本非常强大,因为它可以访问 Web 应用程序返回给浏览器的所有内容。这包括可能包含敏感数据的 cookie,包括用户会话 ID。事实上,XSS 攻击的一个常见利用方式是将用户的会话 ID 令牌发送给攻击者,以便他们可以劫持会话。

为了防止这种情况,大多数浏览器现在都支持 cookie 上的 Http-Only 属性。当服务器在浏览器上设置 cookie 时,设置 Http-Only 属性会告诉浏览器不允许从 DOM 访问 cookie。这可以防止客户端基于脚本的攻击访问存储在这些 cookie 中的敏感数据。

本地和会话存储浏览器数据也可以以相同的方式被盗,尽管无法通过 DOM 访问来保护它。因此最好避免将敏感信息(例如令牌)存储在浏览器存储中,除非由于 Web 应用程序架构的特定功能而有必要。

8. 诱导用户执行意外的操作

跨站点请求伪造 (CSRF)攻击试图诱使浏览器在用户已登录的网站上执行恶意请求,即使当时该站点实际上并未打开。如果目标站点上的会话是基于 cookie 的,则可以使用授权 cookie 自动丰富对该站点的请求。

黑客还可以实现自己的网页,并在用户打开网页时让他们在后台对其他网站执行恶意请求。他们还可以使用社交媒体、论坛和其他平台发布恶意链接或其他内容,迫使浏览器使用用户的会话 cookie 对其他站点进行不被注意的调用。

避免此漏洞的一般技术是实现客户端-服务器通信的标记化,其中引入了一个未存储在 cookie 中的附加标记。应在会话建立时为网站上的每个表单生成令牌,并应在用户出现在网站上时与每个请求一起发送。

如何处理 JavaScript 安全问题?

可以通过采用 JavaScript 安全最佳实践和使用复杂的扫描工具来保护应用程序和服务器免受 JavaScript 漏洞的影响。

在 Web 开发的世界中,软件工程师必须不断掌握新出现的 JavaScript 安全风险。不仅对应用程序进行功能测试很重要;定期使用 JavaScript 安全测试工具也是防止漏洞的关键。最后,遵循一些简单和常见的最佳实践肯定会增加应用程序的耐用性。

以下 JavaScript 安全最佳实践可以降低这种风险。

  • 避免eval() :不要在代码中使用此命令,因为如果它是 JavaScript 表达式,它只会执行传递的参数。这意味着如果黑客成功操纵输入值,他或她将能够运行她想要的任何脚本。相反,选择更安全的替代选项。
  • 加密:使用 HTTPS/SSL 对客户端和服务器之间交换的数据进行加密。
  • 设置安全 cookie:为确保使用 SSL/HTTPS,请将您的 cookie 设置为“安全”,这会将应用程序 cookie 的使用限制为仅保护网页。
  • 设置 API 访问密钥:为每个最终用户分配单独的令牌。如果这些令牌不匹配,则可以拒绝或撤销访问。
  • 使用 安全的 DOM 操作方法:innerHTML 等方法功能强大且具有潜在危险,因为它们不会限制或转义/编码传递给它们的值。使用类似 innerText 的方法可以提供对潜在危险内容的固有转义。这对于防止基于 DOM 的 XSS 攻击特别有用。
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章