Helmet 中间件
写入常见 HTTP 安全响应 Header
middleware/helmet 用来设置一组常见安全 Header,降低 MIME 嗅探、点击劫持、弱 Referrer 泄漏等风险。它不替代认证、权限、CSRF 或输入校验,只是 HTTP 响应层的基础防护。
安装
go get github.com/duxweb/runa/middleware
基本用法
import "github.com/duxweb/runa/middleware/helmet"
route.Default().Use(helmet.New())
默认 Header
| Header | 默认值 | 作用 |
|---|---|---|
X-Content-Type-Options |
nosniff |
禁止浏览器 MIME 嗅探 |
X-Frame-Options |
SAMEORIGIN |
降低点击劫持风险 |
Referrer-Policy |
no-referrer-when-downgrade |
控制 Referer 泄漏 |
X-XSS-Protection |
0 |
关闭旧浏览器 XSS Auditor |
Cross-Origin-Opener-Policy |
same-origin |
隔离顶级浏览上下文 |
自定义 Header
route.Default().Use(helmet.New(helmet.Config{
ReferrerPolicy: "strict-origin-when-cross-origin",
Custom: map[string]string{
"Permissions-Policy": "geolocation=(), camera=()",
},
}))
允许被指定页面嵌入
如果你要把页面嵌入同域 iframe,默认 SAMEORIGIN 可以保留。如果要被其他域嵌入,需要按业务明确调整:
route.Default().Use(helmet.New(helmet.Config{
FrameOptions: "",
Custom: map[string]string{
"Content-Security-Policy": "frame-ancestors https://portal.example.com",
},
}))
把某个字段设置为空字符串时,中间件不会写这个 Header。
配置项
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Next |
func(*route.Context) bool |
nil |
返回 true 时跳过 |
ContentTypeNosniff |
string |
nosniff |
X-Content-Type-Options |
FrameOptions |
string |
SAMEORIGIN |
X-Frame-Options |
ReferrerPolicy |
string |
no-referrer-when-downgrade |
Referrer-Policy |
XSSProtection |
string |
0 |
X-XSS-Protection |
CrossOriginOpenerPolicy |
string |
same-origin |
Cross-Origin-Opener-Policy |
Custom |
map[string]string |
nil |
额外 Header |
和 security 的关系
security.New(...) 默认包含 helmet。如果你需要自定义 helmet 配置,可以禁用 security 里的 helmet 后单独挂载:
route.Default().Use(security.New(
security.Production(),
security.Disable("helmet"),
))
route.Default().Use(helmet.New(helmet.Config{
ReferrerPolicy: "strict-origin-when-cross-origin",
}))
常见问题
- Helmet 不会自动设置 CORS,CORS 要用 CORS 中间件
- Helmet 不会自动设置 CSP,复杂 CSP 建议通过
Custom自己写 - 静态资源、HTML 页面和 API 都可以使用 Helmet,但 iframe、下载、跨域隔离场景要单独确认 Header 策略