CrossOriginProtection 使用指南
Go 1.25 新增 CrossOriginProtection 使用指南
Go 1.25 引入了 CrossOriginProtection,用于保护 Web 应用免受 CSRF 攻击。本文详细介绍其 API 与常见使用方法。
具体的接口定义可以参考CrossOriginProtection
什么是 CrossOriginProtection
CrossOriginProtection 会拒绝不安全的跨源浏览器请求。它的判断依据是:
Sec-Fetch-Site 请求头(2023 年起所有主流浏览器支持)
或 Origin 请求头与 Host 对比
默认允许的安全方法:GET、HEAD、OPTIONS
具体的逻辑可以阅读源码func (*CrossOriginProtection) Check
1. 创建实例
| 1 | cop := http.NewCrossOriginProtection() | 
- 零值有效,无需初始化参数
- 支持并发调用
2. 添加可信来源
| 1 | err := cop.AddTrustedOrigin("https://myapp.com") | 
- 允许来自特定 Origin 的请求
- Origin 格式:scheme://host[:port]
3. 添加不安全路径绕过
| 1 | cop.AddInsecureBypassPattern("/public/") | 
- /public/路径将不进行跨源检查
- 规则与 http.ServeMux相同
- 可并发调用
4. 自定义拒绝逻辑
| 1 | cop.SetDenyHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { | 
5. Handler 用法(推荐用于整条路径)
Handler 方法会在调用实际 handler 前自动执行跨源检查,如果不通过则返回 403 或自定义拒绝逻辑。
| 1 | http.Handle("/api/", cop.Handler(http.HandlerFunc(apiHandler))) | 
- 优点:简单、自动处理请求拒绝
- 场景:整条 API 路径都需要统一保护
6. Check 方法用法(手动检查单个请求)
Check 方法用于在业务逻辑中手动判断请求是否被允许。
| 1 | func apiHandler(w http.ResponseWriter, r *http.Request) { | 
- 优点:精细控制,可根据条件选择性检查
- 场景:单个请求、复杂中间件或特殊逻辑处理
7. 直接在 http.ListenAndServe 使用
也可以直接在主 handler 里使用 Check:
| 1 | http.ListenAndServe(":8080", cop.Handler(mux)) | 
- 适合没有复杂路由的简单服务
- 不需要额外包装 Handler
8. 总结
| 方法 | 用途 | 场景 | 
|---|---|---|
| Handler | 自动检查跨源请求,失败返回 403 或自定义 | 整条 API 路径统一保护 | 
| Check | 手动检查请求,返回 error | 单个请求或复杂业务逻辑控制 | 
| AddTrustedOrigin | 添加可信 Origin | 允许特定来源请求 | 
| AddInsecureBypassPattern | 添加不安全路径绕过 | 静态资源或无需检查的路径 | 
| SetDenyHandler | 自定义拒绝逻辑 | 替代默认 403 返回 | 
通过 Go 1.25 的 CrossOriginProtection,Web 应用可以更简单地实现 CSRF 防护,同时保留手动检查和自定义拒绝逻辑的灵活性。
完整示例
| 1 | package main | 
这样,你可以灵活地选择某些路径使用全局保护,某些路径手动调用 Check 方法。