Skip to main content

Helmet

Helmet可以通过适当设置HTTP头来帮助保护您的应用免受一些众所周知的Web漏洞的影响。 通常,Helmet只是一组设置与安全相关的HTTP头的较小中间件函数(详细信息请阅读)。

note

请注意,将helmet应用为全局或注册它必须在对app.use()或可能调用app.use()的设置函数之前完成。 这是由底层平台(即Express或Fastify)工作的方式决定的,其中中间件/路由的定义顺序很重要。 如果在定义路由之后使用像helmet或cors这样的中间件,那么该中间件将不适用于该路由,它将仅适用于在中间件之后定义的路由。

在Express中使用(默认)

首先安装所需的包。

npm i --save helmet

安装完成后,将其应用为全局中间件。

import helmet from 'helmet';
// 在初始化文件中的某处
app.use(helmet());
warning

使用helmet、@apollo/server(4.x) 和Apollo Sandbox时, Apollo Sandbox上的CSP可能会有问题。 为了解决此问题,请按照以下配置CSP

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包:

npm i --save @fastify/helmet

不应将fastify-helmet用作中间件, 而是应将其用作Fastify插件, 即通过使用app.register()

import helmet from '@fastify/helmet'
// 在初始化文件中的某处
await app.register(helmet)
warning

在使用apollo-server-fastify@fastify/helmet时, GraphQL播放器上的CSP可能会有问题,为了解决这个冲突, 请按照以下配置CSP

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,
});