十四、保护和扩展 Node 应用

扩展和保护您的应用非常重要。扩展和保护不是一次性的任务。当您添加新功能以提高应用安全性时,您需要不断对代码进行更改,当您的应用 Flex 和数据增加时,您需要扩展您的服务器。在本章中,您将学习如何使 Node.js 应用更加安全,以及如何扩展 Node.js 应用。我将假设您正在使用快速创建您的网络服务器,因为这是最常见的。

在本章中,我们将介绍:

  • 应用漏洞
  • 非漏洞攻击
  • 各种第三方服务来保护您的应用
  • 检查第三方包中的安全问题
  • Flex 分配技术

应用中常见的漏洞

根据维基百科,一个漏洞是应用中的一个弱点,它允许攻击者降低系统的信息保证。应用会暴露不同类型的漏洞。

让我们看看一些重要的漏洞以及如何防止它们。

头盔

头盔是一个 Node.js 库,通过设置各种安全相关的 HTTP 头来帮助你防范各种攻击。

以下是头盔添加的各种标题:

  • Strict-Transport-Policy:这个头用于强制服务器的安全连接。HTTPS 防止中间人攻击。在中间人攻击中,攻击者秘密改变客户端和服务器之间的通信。这样做是为了窃取数据,在网页上添加广告,等等。
  • X-Frame-Options:此表头提供点击顶起保护。点击劫持 是一种技术,攻击者使用多个透明或不透明层来欺骗用户点击另一个页面上的按钮或链接,当他们打算点击顶级页面时。因此,攻击者“劫持”了针对其页面的点击,并将其路由到其他页面,这些页面很可能由另一个应用、域或两者拥有。此标题防止应用在 iFrame 中被查看,因此提供 clickjacking 保护。
  • X-XSS-Protection:这个头球防止反射 XSS 攻击。反射 XSS 攻击是 XSS 攻击的一种。跨站点脚本 ( XSS )攻击是一种类型的注入,在这种注入中,恶意脚本被注入到其他良性和可信的网站中。当攻击者使用 web 应用向不同的最终用户发送恶意代码(通常以浏览器端脚本的形式)时,就会发生 XSS 攻击。反射 XSS 是最常见的 XSS 攻击类型。它们也被称为非持久性 XSS 攻击,因为攻击负载是通过单个请求和响应来传递和执行的。当攻击者将可执行的 JavaScript 代码注入到 URL 中,从而将代码注入到 HTML 响应中时,就会出现反射 XSS。
  • X-Content-Type-Options:浏览器可以覆盖响应Content-Type头,使用隐式内容类型猜测和处理数据。虽然这在某些场景中可能很方便,但它也可能导致某些类型的攻击,例如 MIME 混淆攻击、授权热链接等。返回X-Content-Type-Options将导致浏览器使用提供的Content-Type标题,并且不会将内容解释为不同的内容类型。
  • Content-Security-Policy:这个头让我们向浏览器提供一个可信来源的列表,从这个列表中可以将 JavaScript、CSS、HTML 框架、字体、图像和可嵌入对象(Java 小程序、ActiveX、音频和视频)等内容加载到页面上。这有助于我们防止 XSS 袭击。

要了解更多关于头盔的信息,请访问 https://www.npmjs.com/package/helmet T2

跨站点请求伪造

跨站点请求伪造 ( CSRF )是一种类型的攻击,其中来自用户的请求被发送到服务器,而用户并不知道。

例如,如果攻击者能够找到一个可复制的链接,该链接在受害者登录到目标页面时在目标页面上执行特定的操作,那么他就能够在他控制的页面上嵌入这样的链接,并诱骗受害者打开它。携带攻击的链接可能被放置在受害者登录到以 HTML 电子邮件正文或附件形式发送的目标站点时可能访问的位置。

有各种方法可以防止 CSRF 袭击。大多数 CSRF 防范技术通过在请求中嵌入额外的身份验证数据来工作,这允许 web 应用检测来自未授权位置的请求。

Node.js 有一个名为csrf(https://www.npmjs.com/package/csrf)的库,可以防止 CSRF 攻击。它为您提供中间件来保护 Express 网络服务器免受 CSRF 攻击。

跨站点脚本

我们之前已经看到了 XSS 的弱点。我们基本上看到了什么是反射 XSS 攻击。还有另一种类型的 XSS 攻击叫做储存 XSS

当应用存储未正确过滤的用户输入时,就会出现存储 XSS。例如,在聊天时,如果一条消息没有被清理,那么两个用户都可以通过将<script>标签内的 JS 代码作为消息发送,在对方的浏览器上运行脚本。

为了防止这两种类型的 XSS 攻击,我们应该始终过滤/净化用户输入。

会话固定

会话固定是一种允许攻击者劫持有效用户会话的攻击。以下是几种防止会话固定的技术:

  • 设置会话超时
  • 频繁重新生成会话令牌
  • 注销时,使会话令牌过期
  • 创建会话时存储用户代理和用户的 IP 地址,并在以下 HTTP 请求期间检查该值是否匹配。

非基于漏洞的攻击

有各种各样的攻击可以对任何类型的应用进行,因为它们依赖于应用中的漏洞。不过,应用可以做很多事情来防止这些攻击。

让我们看看一些最常见的非基于漏洞的攻击以及如何防止它们。

拒绝服务攻击

一次拒绝服务 ( DoS )攻击是企图让一台服务器暂时对其预定用户不可用。攻击者使用一台或多台机器向服务器发出连续请求以将其关闭。

防止 DoS 的最好方法是使用外部服务,如 CloudFlare,它使用许多不同的技术和来自各种来源的数据来阻止您服务器上的恶意请求。最好避免在你的服务器上处理 DoS,把它留给 DoS 专家创建的服务。

蛮力攻击

暴力攻击的目的是让 T2 成为最简单的进入网站的方法:一遍又一遍地尝试用户名和密码,直到它进入。

以下是几种防止暴力攻击的方法:

  • 我们可以将验证码嵌入到可以完全防止机器人进行蛮力攻击的表单中,减缓人类进行蛮力攻击的速度。
  • 有一个名为快递-暴力的快递服务器中间件程序,它基于几个因素来限制传入请求的速率。您可以在https://www.npmjs.com/package/express-brute了解更多关于快递蛮力的信息。

使用安全包

您使用的 npm 包可能包含可能影响您的应用的关键安全漏洞。不可能遍历每个包的代码或者分别测试每个包。

有一个名为Node Security Project的数据库,里面有一个最重要的易受攻击包的列表。您可以使用命令行工具,如nsp(【https://www.npmjs.com/package/nsp】)和requireSafe(【https://www.npmjs.com/package/requiresafe】)来检查应用的易受攻击的依赖关系。

您应该始终关注您的应用所依赖的软件包的新版本,并对其进行更新,因为新版本通常会修复与安全性相关的问题。

扩展 Node.js 服务器

如果您的应用有许多用户同时访问系统,那么显然单个服务器无法处理所有 Flex。它会减速并崩溃。因此,我们需要在多台服务器上部署应用,然后在它们之间平均分配 Flex。

为了在服务器之间分配 Flex,我们需要使用一种叫做负载平衡器的东西。负载平衡器是位于应用服务器前面的服务器。客户端与负载平衡器而不是应用服务器通信,负载平衡器不处理请求,而是将其转发给应用服务器;当应用服务器发送响应时,它会向客户端发送相同的响应。

由于负载平衡器实际上并不处理请求,因此它可以处理比应用服务器更多的请求。显然,负载平衡器不能处理无限的请求,所以我们可以使用多个负载平衡器。当我们使用多个负载平衡器时,它们之间的 Flex 是通过使用循环 DNS 技术来分配的。在循环域名系统中,指向负载平衡器的域的 IP 地址根据适当的统计模型而变化。

亚马逊 Web 服务 ( AWS )提供了一个名为亚马逊 ELB 的负载均衡器,可以用来在亚马逊 EC2 服务器,也就是应用服务器之间分配 Flex。显然,很难预测扩展应用所需的 EC2 实例总数;因此,AWS 还提供了一些叫做自动缩放的东西,可以根据需要添加/删除 EC2 实例。因此,要托管一个大规模的应用,亚马逊是最好的选择。它还提供了许多其他云服务来扩展和部署您的应用。

如果你不想担心服务器的扩展、部署和管理,那么你可以使用像 Heroku 这样的云服务,这使得实现这一切变得容易得多,你只需要担心应用代码——就是这样。

总结

在本章中,我们看到了许多服务和库来扩展和保护 Node.js 应用。我们看到了各种漏洞以及如何防止它们。确保您定期备份数据,这样即使您的应用被黑客攻击,您仍有机会让应用再次运行,因为数据不会丢失。显然,关于扩展和保护 Node.js 应用还有很多需要学习的地方,因为这是一个永无止境的话题,新事物经常出现。