Skip to content

Nest 实战 (五)

网络安全 helmet

注意

  1. 默认头带有框架信息,如:X-Powered-By: Express
  2. 默认头带有服务器信息,如:Server: Express
  3. 默认头带有安全信息,如:X-Download-Options: noopen
  4. 默认头带有安全信息,如:X-Content-Type-Options: nosniff

所以针对以上信息,我们需要使用 helmet 来进行安全防护

网络安全

1. 安装依赖

bash
pnpm i helmet -S

2. 使用

ts
// 网络安全
import helmet from "helmet";
// web 安全,防常见漏洞
// 注意: 开发环境如果开启 nest static module 需要将 crossOriginResourcePolicy 设置为 false 否则 静态资源 跨域不可访问

// crossOriginOpenerPolicy

// 'same-origin-allow-popups',允许来自同源的弹窗访问父窗口,但阻止跨域弹窗访问‌

// crossOriginResourcePolicy:这个选项用于设置 Cross-Origin-Resource-Policy HTTP 头部。这个头部用于控制一个文档如何处理跨源资源请求。在这个例子中,设置为 false,表示禁用这个功能。
app.use(
  helmet({
    crossOriginOpenerPolicy: { policy: "same-origin-allow-popups" },
    crossOriginResourcePolicy: false, // 针对静态模块,如果开启,静态资源将无法访问
  })
);

3. 其他配置参考

基本配置

js
// 自定义配置
app.use(
  helmet({
    contentSecurityPolicy: {
      directives: {
        defaultSrc: ["'self'"],
        styleSrc: ["'self'", "https://fonts.googleapis.com"],
        fontSrc: ["'self'", "https://fonts.gstatic.com"],
        scriptSrc: ["'self'"],
        imgSrc: ["'self'", "data:"],
      },
    },
    frameguard: {
      action: "deny",
    },
    hsts: {
      maxAge: 31536000,
      includeSubDomains: true,
      preload: true,
    },
    dnsPrefetchControl: {
      allow: false,
    },
    expectCt: {
      maxAge: 86400,
      enforce: true,
      reportUri: "http://example.com/ct-report",
    },
    hidePoweredBy: true,
    noSniff: true,
    referrerPolicy: {
      policy: "no-referrer",
    },
    xssFilter: true,
  })
);

contentSecurityPolicy(CSP)

  • 控制资源加载策略

  • 可以设置各种资源的白名单

  • 示例配置

bash

contentSecurityPolicy: {
  directives: {
    defaultSrc: ["'self'"],
    styleSrc: ["'self'", 'https://example.com'],
    scriptSrc: ["'self'"]
  }
}

frameguard

  • 防止点击劫持

  • 可选值:'deny' 或 'sameorigin'

bash
frameguard: {
  action: 'deny'  // 完全禁止被嵌入 iframe
}

hsts (HTTP Strict Transport Security)

  • 强制使用 HTTPS
bash
hsts: {
  maxAge: 31536000,  // 1年
  includeSubDomains: true,  // 包含子域名
  preload: true  // 允许预加载到 HSTS 列表
}

dnsPrefetchControl

bash

dnsPrefetchControl: {
  allow: false  // 禁用 DNS 预取
}

expectCt

  • 控制 Certificate Transparency
bash
expectCt: {
  maxAge: 86400,
  enforce: true,
  reportUri: 'http://example.com/ct-report'
}

hidePoweredBy

  • 隐藏 X-Powered-By 头
bash
hidePoweredBy: {
  setTo: 'PHP 4.2.0'  // 可选,设置自定义值
}

noSniff

  • 防止 MIME 类型嗅探
bash

noSniff: true

referrerPolicy

  • 控制 Referer 头信息
bash
referrerPolicy: {
  policy: 'no-referrer'
}

xssFilter

  • 启用 XSS 保护
bash
xssFilter: true