• NestJS Logo
    NestJS 中文文档
    v10.0.0
    • 介绍
    • 快速上手
    • 控制器
    • 提供者
    • 模块
    • 中间件
    • 异常过滤器
    • 管道
    • 守卫
    • 拦截器
    • 自定义装饰器
    • 自定义提供者
    • 异步提供者
    • 动态模块
    • 依赖注入作用域
    • 循环依赖
    • 模块引用
    • 懒加载模块
    • 执行上下文
    • 生命周期事件
    • 发现服务
    • 跨平台无关性
    • 测试
  • 迁移指南
  • API 参考
  • 官方课程
  1. 文档
  2. 安全实践
  3. Helmet 安全中间件

英文原版
加密与哈希
CORS

Helmet 安全中间件

Helmet 是一组可帮助提升 Web 应用安全性的中间件集合。它通过设置一系列合适的 HTTP 头部,防止常见的 Web 漏洞攻击,例如跨站脚本(XSS)、点击劫持等。Helmet 实际上由多个独立的中间件函数组成,每个函数负责配置一个具体的安全相关 HTTP 头部。详细信息请参考官方文档。

提示

请注意,helmet 无论作为全局中间件还是局部中间件,都必须在所有 app.use() 调用和路由定义之前注册。因为底层平台会按照中间件的注册顺序依次处理请求,如果在路由之后再引入 helmet 或 cors 这类中间件,它们将无法生效于先前已定义的路由。

在 Express 中使用

首先,安装必要的依赖项:

npm install helmet

安装完成后,将 helmet 注册为全局中间件:

main.ts
import helmet from 'helmet'

app.use(helmet())
提示

如果你的应用同时使用了 helmet、@apollo/server(v4 版本)以及 Apollo Sandbox,可能会遇到由于 内容安全策略(CSP) 限制导致 Sandbox 无法加载的问题。为解决该问题,可以对 helmet 进行如下配置:

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 install @fastify/helmet

与 Express 不同,@fastify/helmet 不应作为中间件使用,而应通过 app.register() 方法注册为 Fastify 插件:

与 Express 中作为中间件使用的方式不同,@fastify/helmet 应通过 app.register() 方法注册为 Fastify 插件:

main.ts
import helmet from '@fastify/helmet'

await app.register(helmet)
注意

当 @fastify/helmet 与 apollo-server-fastify 一同使用时,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'`,
        `'unsafe-inline'`,
        'https:',
        'cdn.jsdelivr.net',
        `'unsafe-eval'`,
      ],
    },
  },
})

如果你希望完全禁用 CSP,可以如下配置:

await app.register(fastifyHelmet, {
  contentSecurityPolicy: false,
})