Security

Helmet

学习如何使用Helmet保护NestJS应用免受常见Web漏洞攻击,通过设置适当的HTTP头部提升安全性

Helmet

Helmet可以通过适当设置HTTP头部来帮助保护您的应用免受一些已知的Web漏洞攻击。通常,Helmet只是一个较小中间件函数的集合,用于设置与安全相关的HTTP头部(阅读更多)。

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

与Express一起使用(默认)

首先安装所需的包。

$ npm i --save helmet

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

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

警告 当使用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)

警告 当使用apollo-server-fastify@fastify/helmet时,GraphQL playground上可能会出现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,
});