【发布时间】:2020-06-27 14:46:45
【问题描述】:
问题:
休息 API 应该使用哪些 Helmet 模块?
背景:
我正在构建一个 Node/Express REST Api,并不断看到 Helmet 作为我应该使用的安全中间件弹出。查看 Helmet 的文档似乎有些模块(内容安全策略、跨域等)仅适用于前端应用程序。哪些模块应该在 Helmet 中用于 Rest API?
【问题讨论】:
标签: node.js rest api express helmet.js
问题:
休息 API 应该使用哪些 Helmet 模块?
背景:
我正在构建一个 Node/Express REST Api,并不断看到 Helmet 作为我应该使用的安全中间件弹出。查看 Helmet 的文档似乎有些模块(内容安全策略、跨域等)仅适用于前端应用程序。哪些模块应该在 Helmet 中用于 Rest API?
【问题讨论】:
标签: node.js rest api express helmet.js
tl;dr:以下内容可能对 API 有用,但您可以设置更多以确保安全:
helmet.expectCt 设置 Expect-CT 标头,如果您的 API 的使用者知道如何处理证书透明性,那么它很有用helmet.frameguard 设置 X-Frame-Options 标头,如果您的 API 响应被放入 iframe 或类似名称中,它会很有用。 (我个人也遇到过。)helmet.hsts,设置 Strict-Transport-Security 标头,有助于保持用户使用 HTTPShelmet.noSniff 设置 X-Content-Type-Options 标头,在可能尝试自动检测您的 API 响应类型并执行意外操作的浏览器中很有用。 (我个人也遇到过。)helmet.permittedCrossDomainPolicies,它设置了 X-Permitted-Cross-Domain-Policies 标头,可能有助于保护您的网站免受来自 Adobe 产品(如 Flash)的奇怪请求这里是 Helmet 的作者。
我想说将 Helmet(或它设置的 HTTP 标头)与 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 标头,可能有用让用户使用 HTTPSX-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 可能没用总而言之:其中一些可能有用 — 为了安全起见,可能值得设置其中一些标头。
【讨论】:
xssFilter 可能没用,因为 (1) API 使用者根本不应该执行 JavaScript (2) 即使在浏览器中,它也不是针对 XSS 攻击的彻底保护。
Helmet 是一个 Express.js 中间件。并且用于避免脚本注入。初始化应用时,请像这样使用 Helmet:
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet());
希望这有帮助:)
【讨论】:
人们在他们的 restful api 中使用 Helmet 的主要原因是避免 (XSS) 和脚本注入。你所要做的就是这个。请记住,它只是一个快速中间件。
const helmet = require("helmet");
app.use(helmet())
【讨论】: