Node/Express 安全

Node/Express security

我正在开发我的第一个节点应用程序。现在可以部署了,我想保护我的应用程序。所以我使用这些库来保护它。

import mongoSanitize from 'express-mongo-sanitize';
import helmet from 'helmet';
import xss from 'xss-clean';
import hpp from 'hpp';
import cors from 'cors';
import rateLimit from 'express-rate-limit';

我想知道的是,我在这里复制东西了吗?我必须使用所有这些库吗?这里的库是否做同样的事情,以便我可以通过从应用程序中删除不必要的中间件来删除它们以提高应用程序的性能?

您不能仅仅堆砌一些“安全”库就神奇地变得“安全”。您不认为如果这是可能的,所有这些包都会自动应用吗?

让我们看看这些模块实际做了什么...

express-mongo-sanitize

This module searches for any keys in objects that begin with a $ sign or contain a ., from req.body, req.query or req.params. It can then either:

  • completely remove these keys and associated data from the object, or
  • replace the prohibited characters with another allowed character.

这(可以说)是一个非常糟糕的主意。如果您一开始就正确地转义内容以便在查询中使用,那么就不需要存在这样的清理功能。然后,您就不必担心像这样的模块会完全破坏您的数据结构。此外,如果你确实依赖这种库,你可以肯定会有 some 方法解决它,因为它没有解决根本问题......混合数据和命令的上下文是危险的 error-prone.

头盔

Helmet is a collection of 14 smaller middleware functions that set HTTP response headers.

这个包有一大堆东西,从 HSTS 到禁用缓存。 None 其中是某种安全灵丹妙药,因为此包的作者在自述文件的最顶部警告说:

It's not a silver bullet, but it can help!

您应该了解所有这些 headers 的实际作用,以便您可以正确使用它们。此外,您希望在您的 Web 服务器(例如 Nginx)上应用其中的大部分内容,而不是在您的应用程序中处理它。

xss-clean

This will sanitize any data in req.body, req.query, and req.params. You can also access the API directly if you don't want to use as middleware.

没有什么比带有 near-zero 4 年未触及文档的 NPM 包更能说明“安全性”了。不过,这确实是一个糟糕的主意。只有当您将该数据插入 HTML 时,您才应该为 HTML 的上下文转义数据。如果你早点这样做,你只是在破坏你的数据。对此的误解实际上会导致您将来出现安全问题,更不用说应用程序崩溃了。 (另请参阅:The holy grail of cleaning input and output in php?

hpp

Express middleware to protect against HTTP Parameter Pollution attacks

此模块采用多个查询字符串变量并防止它们作为数组返回。如果这是你想要的,这很好,但是在查询字符串中有多个相同的键是 intendedwell-documented 行为您的应用程序可以使用。如果这是一个问题,您应该实际修复您的应用程序,而不是依赖此模块来破坏标准行为。

科尔斯

正如 @jfriend00 指出的那样,CORS 库可帮助您添加适当的响应 headers 以启用 cross-origin 对数据的访问。这可能是安全和适当的,但您可能不想默认启用。

express-rate-limit

Basic rate-limiting middleware for Express. Use to limit repeated requests to public APIs and/or endpoints such as password reset.

这个可以有用,如果你想要速率限制。我建议在 Web 服务器级别执行此操作,而不是在您的应用程序中弄乱它。 Nginx 和类似工具有高效和快速的 modules/configurations,与将其构建到您构建的每个 Node.js 应用程序中相比,它们能够更好地处理这个问题。

TL;DR;

了解您要防范的是什么,否则无论您安装什么模块,您都绝对注定不安全。安全不是你安装的补丁。