所有文章 > 技术杂货铺 > Node.js中的安全指南
Node.js中的安全指南

Node.js中的安全指南

在本文中,您将了解 Node.js 中的安全性以及保护 Node.js 应用程序的最佳实践。在这种情况下,安全性意味着保护数据。要构建出色的软件和系统,您必须从开发路线图的第一阶段开始考虑安全性。这意味着安全性应该是软件开发过程的核心。 

本指南将带您了解使用 Node.js 构建软件时需要考虑的关键安全概念。我们首先来看看 Node.js 如何支持安全实践。 

安全性和 Node.js:入门

最重要的是,Node.js 核心的优势在于其周边的社区。Node.js 社区将安全性视为 Node.js 开发的关键因素。这促成了 Node.js安全工作组(SWG) 的成立,其使命是提高使用 Node.js 构建的应用程序的安全性。它通过将社区中的漏洞数据带到 Node 安全平台来实现这一目标,同时还维护已披露安全漏洞的漏洞数据。SWG 还确保正确记录 Node 软件包中的漏洞,并公开报告已知的安全问题。 

但是,您应该注意,SWG负责管理或响应针对 Node.js 本身的安全报告。Node.js TSC拥有这一责任。 

Node.js 中的相关库或框架

Node.js 有几个模块可以提高软件应用程序的效率。因此,正确集成这些模块将提高 Node.js 应用程序的安全性。此外,这些模块可以自由添加,它们可以提高 Node.js 应用程序的整体效率,同时收紧松散的末端。我将介绍其中的一些库和框架。 

1. Express.js

列表中的第一个是Express,这是一个 Node.js 框架,当您需要轻松处理 Node.js 中的动词操作(如 GET、POST 和 DELETE 请求)时可以使用它。它使用称为路由的不同路径处理每个请求。Express.js 使用 Node.js 中间件理念来提供中间件模块,以解决 Node.js 中的特定关键问题(如安全性)。 

列表上的下一个是头盔。   

2. Helmet.js

Helmet是一个 Express 中间件,它有助于设置各种 HTTP 响应标头,以保护 Node.js 应用中 GET 和 POST 请求的安全。它用作 HTTP 标头安全模块。它提供设置 HTTP 标头的中间件函数。 

这些 HTTP 标头包括以下内容: 

  • helmet.contentSecurityPolicy()设置 Content-Security-Policy 标头,有助于缓解跨站点脚本攻击(XSS)。
  • helmet.xssFilter()通过将 X-XSS-Protection 标头设置为 0 来禁用浏览器的错误跨站点脚本过滤器。

您可以浏览此列表来查看可以使用 Helmet 在 Node.js 应用程序中设置的所有 HTTP 标头。 

接下来,我们将介绍用于保护密码的 Node.js 模块 Bcrypt。 

3. Bcrypt

Bcrypt是 Node.js 提供的密码安全模块。Bcrypt 库可保护用户免受暴力破解等攻击。这是通过一种称为加盐的哈希方法实现的。需要澄清的是,加盐是一种在实际进行哈希处理之前向密码添加随机字符串的技术。 

为了做到这一点,根据 Bcrypt 文档,  “Bcrypt 库使用.genSalt()方法来生成盐和哈希”。

使用盐和哈希的独立函数,您可以生成密码哈希,然后生成盐,如下所示。 

bcrypt.genSalt(saltRounds, function(err, salt) {

bcrypt.hash(PlainPassword, salt, function(err, hash) {

// Store password hash in database

});

});

通过单独的函数调用,您可以自动生成盐和哈希,如下所示。 

bcrypt.hash(PlainPassword, saltRounds, function(err, hash) {

// Store password hash in database

});

可以使用下面的代码块检查密码的正确性。当散列密码与纯密码匹配时,该函数返回true 。

// Load hash from your password DB.
bcrypt.compare(PlainPassword, hash, function(err, result) {
// result == true
});
Node.js 安全指南 图片

4. Validator.js

列表中的下一个是 Validator,它是一个输入验证模块。它强制要求用户输入符合要求。同样,它确保输入的正确性。此列表包括您可以使用 Validator 包配置的所有验证器。 

5. ESLint 插件

提高 Node.js 应用安全性的另一种方法是集成 ESLint,这是一个 linting 安全插件,可帮助在开发过程中识别易受攻击的 Node.js 代码。易受攻击的代码实现包括不安全的正则表达式、for循环内的“await”关键字等。  

安全最佳实践

无论您使用 Node.js 构建什么应用程序,都应该在开发的第一阶段执行关键的安全程序。

因此,为了保证 Node.js 应用程序安全且没有漏洞,在构建 Node.js 应用程序时实施必要的安全最佳实践非常重要。我们将在本节中介绍其中的几个。 

始终审计 Node 模块

首先,始终审核您在项目中使用的每个节点模块以进行漏洞检查是必不可少的。审核有助于确认哪些软件包可以升级。当您审核软件包时,您也在确认软件包的安全性。 

因此,为了审核包/模块并检查易受攻击的依赖项,您可以使用 Snyk、Node Security Project (NSP) 等工具,或运行 npm-audit 来追踪和修补漏洞。 

始终使用速率限制

其次,暴力破解之类的攻击是 Node.js 应用常见的安全威胁,而登录路由是这种攻击最常针对的目标。速率限制有助于限制暴力破解攻击的影响。Node.js ratelimiter包有助于将速率限制集成到您的 Node.js 应用中。使用 ratelimiter 模块,您可以根据用户的 ID 限制中间件的实现。 

var id = req.user._id;

var limit = new Limiter({ id: id, db: db });

limit.get(function(err, limit){

if (err) return next(err);

res.set('X-RateLimit-Limit', limit.total);

res.set('X-RateLimit-Remaining', limit.remaining - 1);

res.set('X-RateLimit-Reset', limit.reset);



// looks good

debug('remaining %s/%s %s', limit.remaining - 1, limit.total, id);

if (limit.remaining) return next();



// does not look good

var delta = (limit.reset * 1000) - Date.now() | 0;

var after = limit.reset - (Date.now() / 1000) | 0;

res.set('Retry-After', after);

res.send(429, 'Rate limit exceeded, retry in ' + ms(delta, { long: true }));

});

Express Brute软件包还可以进行速率限制,以减轻暴力破解和拒绝服务 (DoS) 攻击。 

使用 TLS/SSL 进行数据传输

第三,在将数据从一层传输到另一层时,数据保密性非常重要,以防止潜在攻击者的嗅探。通过加密保护数据传输的一种常见方法是使用传输层安全性 (TLS) 和安全套接字层 (SSL)。需要澄清的是,SSL 对客户端-服务器连接进行端到端加密,而 TLS 保护密码数据和信用卡详细信息等敏感信息。 

转义输出

此外,为了避免跨站点脚本 (XSS) 等注入攻击,输出转义起着关键作用。本文后面将解释 XSS。要转义代码中的输出,您可以使用Node ES API 库或Escape HTML 库来转义用户可以访问的所有 JavaScript 和 HTML 代码。 

记录并监控您的应用程序

最后,服务器上的负载可能会导致 DoS,从而导致应用程序停机。因此,监控服务器的传入和传出流量非常重要,当服务器处于极端负载时,您可以随时收到警报。如果您的服务器不是因为极端负载而崩溃,而是由于安全攻击,则必须正确使用日志来了解安全攻击发生的方式和时间。Bunyan Node.js模块有助于高效记录您的 Node.js 服务。TooBusy Node.js 模块是监控 Node.js 应用程序的重要工具 

OWASP Node.js 安全备忘单包含全面的安全最佳实践列表。了解安全攻击以及缓解这些攻击的主要方法是安全的关键,这也是下一节的内容。 

最常见的 Node.js 安全攻击

Node.js 有几种安全攻击,但我们将在本部分详细回顾常见的攻击。 

SQL 注入

SQL 注入涉及通过用户输入的数据向应用程序插入 SQL 查询。这些攻击利用应用程序中要求用户输入的区域。实施 SQL 注入攻击的攻击者在成功攻击后将能够访问应用程序的数据库。您可以在 StackHawk 上阅读有关 SQL 注入的更多信息。 

为了防止注入攻击,输入验证是关键,上面提到的 Validator 包有助于进行正确的输入验证。Validator 模块具有允许列表和阻止列表验证方法,这些方法用于明确声明您希望在输入验证过程中授权的内容并阻止其他所有内容。 

跨站点脚本 (XSS)

XSS涉及将客户端脚本注入网站。利用 XSS,攻击者能够操纵 Web 应用程序,目的是向 Web 应用程序的用户发送恶意代码。XSS 攻击的目的是窃取用户的数据或控制 Web 应用程序。 

为了防止 XSS 攻击,你需要根据项目需求使用安全的 HTTP 标头。上面提到的 Helmet 提供了设置安全 HTTP 标头的中间件函数。 

命令注入

命令注入是指注入输入,改变易受攻击的应用程序中的有效合法命令,以便执行针对操作系统的非法命令。这种攻击主要针对系统 shell。输入注入​​可以来自用户可以修改的任何来源,例如表单。这种攻击以系统 shell 为目标。 

再次强调,为了防止注入攻击,输入验证是关键。 

跨站资源伪造(CSRF)

CSRF是一种会话劫持形式,用户被迫在当前已通过身份验证的应用程序上运行恶意操作。在 CSRF 攻击中,攻击者劫持真实用户的会话,从而绕过非用户的安全规则。 

为了防止CSRF 攻击,您需要实现将在服务器端生成的令牌。csurf Node.js 包有助于生成有效的 CSRF 令牌。OWASP还提供了生成令牌的最佳实践。 

路径遍历

路径遍历是指由于安全验证薄弱而非法访问文件服务器中的目录的行为。在这种攻击中,攻击者能够通过向 Web 应用程序注入恶意用户输入来访问服务器文件。这种攻击利用了访问控制设置的易受攻击的实现。 

为了防止这种形式的攻击,允许列表起着关键作用。输入验证也起着至关重要的作用。 

结论

在本指南中,您了解了 Node.js 中的安全要点、可用于缓解漏洞攻击的软件包和库,以及加强 Node.js 应用安全性的最佳实践。当然,安全性应该是开发过程中的首要任务,并融入到您下一个 Node.js 应用的各个方面。 

文章来源:Guide to Security in Node.js

#你可能也喜欢这些API文章!