Helmet 可以通过适当设置 HTTP 标头来帮助保护您的应用免受一些众所周知的 Web 漏洞的攻击。通常,Helmet 只是一组较小的中间件函数,用于设置与安全相关的 HTTP 标头(阅读更多内容)。
请注意,将 helmet
用作全局函数或注册它必须在对 app.use()
的其他调用或可能调用 app.use()
的设置函数之前进行。这是由于底层平台(即 Express 或 Fastify)的工作方式,其中中间件/路由的定义顺序很重要。如果您在定义路由后使用 helmet
或 cors
等中间件,则该中间件将不适用于该路由,它仅适用于在中间件之后定义的路由。
与 Express 一起使用(默认)
首先安装所需的软件包。
bash
$ npm i --save helmet
安装完成后,将其作为全局中间件应用。
ts
import helmet from 'helmet'
// 在初始化文件中的某个位置
app.use(helmet())
使用 helmet
、@apollo/server
(4.x) 和 Apollo Sandbox 时,Apollo Sandbox 上的 CSP 可能存在问题。要解决此问题,请按如下所示配置 CSP:
ts
app.use(helmet({
crossOriginEmbedderPolicy: false,
contentSecurityPolicy: {
directives: {
imgSrc: [`'self'`, 'data:', 'apollo-server-landing-page.cdn.apollographql.com'],
scriptSrc: [`'self'`, `https: 'unsafe-inline'`],
manifestSrc: [`'self'`, 'apollo-server-landing-page.cdn.apollographql.com'],
frameSrc: [`'self'`, 'sandbox.embed.apollographql.com'],
},
},
}))
与 Fastify 一起使用
如果您使用的是 FastifyAdapter
,请安装 @fastify/helmet 包:
bash
$ npm i --save @fastify/helmet
fastify-helmet 不应用作中间件,而应用作 Fastify 插件,即通过使用 app.register()
:
ts
import helmet from '@fastify/helmet'
// 在您的初始化文件中的某个位置
awaitapp.register(helmet)
使用 apollo-server-fastify
和 @fastify/helmet
时,可能会出现问题在 GraphQL 游乐场上 CSP,为了解决此冲突,请按如下所示配置 CSP:
ts
await app.register(fastifyHelmet, {
contentSecurityPolicy: {
directives: {
defaultSrc: [`'self'`, 'unpkg.com'],
styleSrc: [
`'self'`,
`'unsafe-inline'`,
'cdn.jsdelivr.net',
'fonts.googleapis.com',
'unpkg.com',
],
fontSrc: [`'self'`, 'fonts.gstatic.com', 'data:'],
imgSrc: [`'self'`, 'data:', 'cdn.jsdelivr.net'],
scriptSrc: [
`'self'`,
`https: 'unsafe-inline'`,
`cdn.jsdelivr.net`,
`'unsafe-eval'`,
],
},
},
})
// If you are not going to use CSP at all, you can use this:
await app.register(fastifyHelmet, {
contentSecurityPolicy: false,
})