4

问题:

哪些 Helmet 模块应该用于 rest API?

背景:

我正在构建一个 Node/Express REST Api,并不断看到 Helmet 作为我应该使用的安全中间件弹出。查看 Helmet 的文档似乎有些模块(内容安全策略、跨域等)仅适用于前端应用程序。哪些模块应该在 Helmet 中用于休息 API?

4

3 回答 3

9

tl; dr:以下内容可能对 API 有用,但您可以设置更多以确保安全:

  • helmet.expectCt,如果您的 API 的使用者知道如何处理证书透明度,则它会设置Expect-CT标头很有用
  • helmet.frameguard设置X-Frame-Options标头,如果您的 API 响应被放入iframe或类似中,它会很有用。(我个人遇到过这个问题。)
  • helmet.hsts,它设置了Strict-Transport-Security标头,有助于让用户使用 HTTPS
  • helmet.noSniff,它设置X-Content-Type-Options标头,在可能尝试自动检测您的 API 响应类型并执行意外操作的浏览器中很有用。(我个人遇到过这个问题。)
  • helmet.permittedCrossDomainPolicies,它设置X-Permitted-Cross-Domain-Policies标题,可能有助于保护您的网站免受来自 Adob​​e 产品(如 Flash)的奇怪请求

头盔的作者在这里。

我想说将 Helmet(或它设置的 HTTP 标头)与 API 一起使用有两个原因:

  1. 一些标头在非浏览器用例中很有用,例如 REST API。
  2. 如果您的响应曾经加载到浏览器中。例如,如果黑客将其放入<iframe>并导致意外发生。(旧的浏览器有时会出现问题,导致漏洞。)您也可以这样做,以防您的 API被加载到浏览器中,即使现在没有加载

Helmet 只是 13 个较小的中间件的集合。其中大多数设置了单个 HTTP 响应标头,并且大多数标头仅在浏览器中有用。但是,有些有时对 API(REST 或其他)有用。

让我们列举它们:

  • helmet.contentSecurityPolicy,它设置Content-Security-Policy标题,可能没有用
  • helmet.dnsPrefetchControl,它设置X-DNS-Prefetch-Control标题,可能没有用
  • helmet.expectCt如果您的 API 的使用者知道如何处理证书透明度,则它设置Expect-CT标头可能很有用
  • helmet.featurePolicy,它设置Feature-Policy标题,可能没有用
  • helmet.frameguard,它设置X-Frame-Options标头,如果您的 API 响应被放入或类似中,它可能很有用。iframe(我个人遇到过这个问题。)
  • helmet.hidePoweredBy,它删除了X-Powered-By标题,可能没有用(它在浏览器中甚至没有那么有用!)
  • helmet.hsts,它设置Strict-Transport-Security标头,可能有助于让用户使用 HTTPS
  • helmet.ieNoOpen,它设置X-Download-Options标题,可能没有用
  • helmet.noCache将在未来的 Helmet 版本中删除,并且无论如何对安全性都不是超级有用,所以它可能没用
  • helmet.noSniff,它设置X-Content-Type-Options标头,在可能尝试自动检测您的 API 响应类型并执行意外操作的浏览器中可能很有用。(我个人遇到过这个问题。)
  • helmet.permittedCrossDomainPolicies,它设置X-Permitted-Cross-Domain-Policies标题,可能有助于保护您的网站免受来自 Adob​​e 产品(如 Flash)的奇怪请求
  • helmet.referrerPolicy,它设置Referrer-Policy标题,可能没有用
  • helmet.xssFilter,它设置X-XSS-Protection标题,可能没有用

总而言之:其中一些可能有用——为了安全起见,可能值得设置其中一些标头。

于 2020-03-16T16:12:36.257 回答
0

Helmet 是一个 Express.js 中间件。并且用于避免脚本注入。当你初始化你的应用程序时,像这样使用 Helmet:

const express = require('express');
const helmet = require('helmet');

const app = express();

app.use(helmet());

希望这有帮助:)

于 2020-03-16T13:44:00.753 回答
0

人们在他们的 api 中使用 Helmet 的主要原因是避免(XSS)和脚本注入。你所要做的就是这个。请记住,它只是一个快速中间件。

const helmet = require("helmet");
app.use(helmet())
于 2020-03-16T13:29:36.900 回答