• 微信:WANCOME
  • 扫码加微信,提供专业咨询
  • 服务热线
  • 13215191218
    13027920428

  • 微信扫码访问本页
desc-2
环企首页

helmet

概述

helmet 通过在 Express 响应中设置各种 HTTP 安全相关响应头,保护应用免受常见的 Web 攻击(如 XSS、点击劫持、MIME 嗅探等)。零配置即可启用常用安全头,也可按需精细配置每一项。

安装:

npm install helmet

核心函数

helmet(options)

全局使用(推荐),设置所有常用安全头。

const express = require('express')
const helmet = require('helmet')
const app = express()

app.use(helmet())  // 启用全部默认安全头

主要中间件(可单独使用)

const helmet = require('helmet')

// Content-Security-Policy(防 XSS/注入)
app.use(helmet.contentSecurityPolicy({
  directives: {
    defaultSrc: ["'self'"],
    scriptSrc: ["'self'", "'unsafe-inline'", 'cdn.example.com'],
    styleSrc: ["'self'", "'unsafe-inline'"],
    imgSrc: ["'self'", 'data:', 'https:'],
    connectSrc: ["'self'", 'api.example.com'],
    fontSrc: ["'self'"],
    objectSrc: ["'none'"],
    mediaSrc: ["'self'"],
    frameSrc: ["'none'"]
  }
}))

// X-Frame-Options(防点击劫持)
app.use(helmet.frameguard({ action: 'deny' }))
// action: 'deny'(禁止iframe)| 'sameorigin'(仅同源可嵌)

// Strict-Transport-Security(HSTS,强制 HTTPS)
app.use(helmet.hsts({
  maxAge: 31536000,        // 1 年(秒)
  includeSubDomains: true,  // 包含子域名
  preload: true            // 加入浏览器预加载列表
}))

// X-Content-Type-Options(防 MIME 嗅探)
app.use(helmet.noSniff())

// X-XSS-Protection(XSS 过滤器,Chrome 已内置)
app.use(helmet.xssFilter())

// X-Download-Options(IE 下载安全)
app.use(helmet.ieNoOpen())

// Referrer-Policy(来源头控制)
app.use(helmet.referrerPolicy({ policy: 'strict-origin-when-cross-origin' }))

// X-DNS-Prefetch-Control(DNS 预取控制)
app.use(helmet.dnsPrefetchControl({ allow: false }))

// Expect-CT(证书透明度)
app.use(helmet.expectCt({ maxAge: 86400, enforce: true }))

// Permitted-Doc-Domain(限制文档域名)
app.use(helmet.permittedCrossDomainPolicies({ permittedPolicies: 'none' }))

完整配置示例

app.use(helmet({
  contentSecurityPolicy: {
    directives: {
      defaultSrc: ["'self'"],
      scriptSrc: ["'self'"],
      styleSrc: ["'self'", "'unsafe-inline'"],
      imgSrc: ["'self'", 'data:', 'https:'],
    }
  },
  frameguard: { action: 'deny' },
  hsts: {
    maxAge: 31536000,
    includeSubDomains: true,
    preload: true
  },
  noSniff: true,
  xssFilter: true,
  referrerPolicy: { policy: 'strict-origin-when-cross-origin' }
}))

常见问题

问题 解决方案
CSP 导致静态资源加载失败 在对应 scriptSrc/styleSrc 中加入域名
被嵌入 iframe 报错 frameguard({ action: 'deny' })
HTTPS 站点的资源被阻止 配置 CSP 的 defaultSrcconnectSrc
不想用某个头 在选项中设为 false 禁用
开发环境不想开启 if (process.env.NODE_ENV !== 'development') app.use(helmet())