Nest 实战 (五)
网络安全 helmet
注意
- 默认头带有框架信息,如:
X-Powered-By: Express
- 默认头带有服务器信息,如:
Server: Express
- 默认头带有安全信息,如:
X-Download-Options: noopen
- 默认头带有安全信息,如:
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