环企首页
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 的 defaultSrc 和 connectSrc |
| 不想用某个头 | 在选项中设为 false 禁用 |
| 开发环境不想开启 | if (process.env.NODE_ENV !== 'development') app.use(helmet()) |