【问题标题】:Node/Express security节点/快递安全
【发布时间】:2020-04-02 04:55:36
【问题描述】:

我正在开发我的第一个节点应用程序。现在它已准备好部署,我希望保护我的应用程序。所以我使用这些库来保护它。

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';

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

【问题讨论】:

  • 因此,您应该使用这些库,因为您了解它们在为您做什么。因此,您应该有一个与两个特定库重叠的更具体的问题。实际上,您似乎只是抓住了一堆与安全性相关的库,而并不真正了解它们的作用。请提出一个更具体的问题,表明您了解每个库涵盖的领域。
  • 仅供参考,cors 库不会“增强”安全性。它的特定目的是允许跨源请求,否则它们会被拒绝。
  • 您可以尝试使用 JWT(JSON 网络令牌),它是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象的形式安全传输信息。

标签: javascript node.js express middleware


【解决方案1】:

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

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

express-mongo-sanitize

此模块从 req.body、req.query 或 req.params 搜索以 $ 符号开头或包含 . 的对象中的任何键。然后它可以:

  • 从对象中完全删除这些键和相关数据,或者
  • 用另一个允许的字符替换禁止的字符。

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

头盔

Helmet 是 14 个较小的中间件函数的集合,用于设置 HTTP 响应标头。

这个包有很多东西,从 HSTS 到禁用缓存。它们都不是某种安全灵丹妙药,正如此软件包的作者在自述文件的最顶部警告的那样:

这不是灵丹妙药,但它可以提供帮助!

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

xss-清理

这将清理 req.body、req.query 和 req.params 中的所有数据。如果您不想用作中间件,也可以直接访问 API。

没有什么比 NPM 包更能说明“安全性”了,它具有近乎零的文档,并且 4 年未触及。不过,这确实是一个糟糕的想法。只有在将数据插入 HTML 时,您才应该为 HTML 的上下文转义数据。如果你过早地这样做,你只是在破坏你的数据。对此的误解实际上可能会导致您未来出现安全问题,更不用说应用程序损坏了。 (另见:The holy grail of cleaning input and output in php?

hpp

Express 中间件防御 HTTP 参数污染攻击

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

cors

正如@jfriend00 所指出的,CORS 库可帮助您添加适当的响应标头以启用对数据的跨域访问。这可能是安全且适当的,但您可能不想默认启用。

快递费率限制

Express 的基本速率限制中间件。用于限制对公共 API 和/或端点的重复请求,例如密码重置。

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

TL;DR;

了解您要保护的是什么,否则无论您安装什么模块,您都注定会不安全。安全性不是您安装的某个补丁。

【讨论】:

  • 看起来 OP 真的应该在来这里之前对这个问题进行自己的研究,然后像他们一样发布一个通用的、非特定的问题。相反,你救助他们并为他们进行研究。由于您显然在这里非常有经验,我希望您也想教人们在来这里之前进行自己的研究。他们在进行自己的研究之后,可以提出一个更具体、更有意义的问题。
  • 谢谢布拉德。非常感谢您的建议。
  • @jfriend00 如果我认为这个人可以通过简单的研究弄清楚,我就不会像我那样回答这个问题。当然,这个人可能已经阅读了 README 文件,但正如我的回答中所指出的,这些模块中有许多从一开始就有缺陷,通常不应该使用。我正在解决核心问题/问题(为什么不[即时安全]),指出列出的各个模块中的问题,并为自己提供一个可以在未来链接到的问题。这个问题经常出现,PHP 的旧答案并不经常出现。
  • @Brad 感谢您的回答,这对初学者非常有用
  • @jfriend00 正如 Brad 所说,通过简单的 Google 研究找出所有这些并不容易。希望布拉德不会像你那样思考
猜你喜欢
  • 2011-08-13
  • 2021-03-24
  • 2021-12-05
  • 2018-04-10
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2016-07-23
相关资源
最近更新 更多