我应该在我的 REST Api 中使用 Helmet 的哪些模块

Posted

技术标签:

【中文标题】我应该在我的 REST Api 中使用 Helmet 的哪些模块【英文标题】:What modules of Helmet should I use in my REST Api 【发布时间】:2020-06-27 14:46:45 【问题描述】:

问题:

休息 API 应该使用哪些 Helmet 模块?

背景:

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

【问题讨论】:

【参考方案1】:

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

helmet.expectCt 设置 Expect-CT 标头,如果您的 API 的使用者知道如何处理证书透明性,那么它很有用 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 的作者。

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

    一些标头在非浏览器用例中很有用,例如 REST API。 如果您的响应曾经加载到浏览器中。例如,如果黑客将其放入<iframe> 并导致意外发生。 (旧版浏览器有时会出现问题,从而导致漏洞。)您也可以这样做以确保您的 API 经得起未来的考验,以防它 曾经加载到浏览器中,即使现在没有。李>

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

让我们列举它们:

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

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

【讨论】:

为什么大小写过滤器没有用?从其他两个 cmets 看来,它用于此目的。 xssFilter 可能没用,因为 (1) API 使用者根本不应该执行 javascript (2) 即使在浏览器中,它也不是针对 XSS 攻击的彻底保护。【参考方案2】:

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

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

const app = express();

app.use(helmet());

希望这有帮助:)

【讨论】:

【参考方案3】:

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

const helmet = require("helmet");
app.use(helmet())

【讨论】:

以上是关于我应该在我的 REST Api 中使用 Helmet 的哪些模块的主要内容,如果未能解决你的问题,请参考以下文章

关于web服务Json/rest api/Nsurl连接

为啥我的rest api post请求不能将我的数组保存在我的mongodb数据库中

如何使用 REST API 在 keycloak 中重置用户密码

Angular:Http删除在我的rest api全栈项目中不起作用

Rest API 设计 PUT vs PATCH

REST - API客户端应该像浏览器一样“前进”到“下一个”资源吗?