Helmet
Helmet 通过适当设置 HTTP 头来帮助保护你的应用免受一些众所周知的 Web 漏洞。通常,Helmet 只是一组设置与安全相关的 HTTP 头的较小中间件函数的集合(了解更多)。
提示
请注意,将 helmet 应用为全局中间件或注册它必须在其他对 app.use() 的调用或可能调用 app.use() 的设置函数之前。这是因为底层平台(即 Express 或 Fastify)的工作方式,中间件/路由的定义顺序很重要。如果你在定义路由之后使用 helmet 或 cors 等中间件,那么该中间件将不会应用于该路由,它只会应用于中间件之后定义的路由。
在 Express 中使用(默认)
首先安装所需的包。
bash
$ npm i --save helmet安装完成后,将其应用为全局中间件。
typescript
import helmet from 'helmet';
// 在你的初始化文件中的某处
app.use(helmet());警告
当同时使用 helmet、@apollo/server(4.x)和 Apollo Sandbox 时,可能会在 Apollo Sandbox 上出现 CSP 问题。要解决此问题,请按如下所示配置 CSP:
typescript
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/helmetfastify-helmet 不应该作为中间件使用,而应该作为 Fastify 插件使用,即通过 app.register() 注册:
typescript
import helmet from '@fastify/helmet'
// 在你的初始化文件中的某处
await app.register(helmet)警告
当同时使用 apollo-server-fastify 和 @fastify/helmet 时,可能会在 GraphQL playground 上出现 CSP 问题,要解决此冲突,请按如下所示配置 CSP:
typescript
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'`,
],
},
},
});
// 如果你完全不打算使用 CSP,你可以这样做:
await app.register(fastifyHelmet, {
contentSecurityPolicy: false,
});