我应该在我的 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
标头,可能有助于保护您的网站免受来自 Adobe 产品(如 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
标头,可能有用来保护您的网站免受来自 Adobe 产品(如 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 的哪些模块的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的rest api post请求不能将我的数组保存在我的mongodb数据库中
如何使用 REST API 在 keycloak 中重置用户密码