golang如何实现SSRF防护策略_golang SSRF防护策略实现方案

张开发
2026/4/23 21:52:47 15 分钟阅读

分享文章

golang如何实现SSRF防护策略_golang SSRF防护策略实现方案
SSRF 是服务端请求伪造Go 因 net/http 默认不限制 URL 而易受攻击防护需三步解析 URL、校验协议仅 http/https、检查主机禁用私有 IP 和非白名单域名。SSRF 是什么为什么 Go 服务特别容易中招SSRFServer-Side Request Forgery不是用户直接攻击你的接口而是诱使你的 Go 服务自己去“访问不该访问的地方”——比如 http://127.0.0.1:8080/admin 或内网 http://10.0.1.5:3306。Go 的 net/http 默认不做任何 URL 限制http.Get(req.URL) 一调就发只要传进来的是合法 URL它就真去连。而很多业务场景天然需要“代理请求”或“URL 回调校验”比如富文本图片自动下载、Webhook 地址验证、OAuth 第三方回调重定向地址解析……这些地方一旦对用户输入的 URL 缺乏白名单或协议/域名约束SSRF 就几乎必然发生。用 net/url net/http 做基础校验的硬核写法别依赖第三方中间件——SSRF 防护必须在业务逻辑入口做且要细粒度控制。核心是三步解析 URL → 检查协议 → 校验主机含 IP 归属。下面这段是生产可用的最小防护骨架func isAllowedURL(rawURL string) error {u, err : url.Parse(rawURL)if err ! nil {return fmt.Errorf(invalid URL format)}if u.Scheme ! https u.Scheme ! http {return fmt.Errorf(disallowed scheme: %s, u.Scheme)}// 解析 host支持域名和 IPv4/IPv6host, port, _ : net.SplitHostPort(u.Host)if host {host u.Host}ip : net.ParseIP(host)if ip ! nil {if ip.IsLoopback() || ip.IsPrivate() || ip.IsUnspecified() {return fmt.Errorf(disallowed private/loopback IP: %s, host)}}// 白名单域名建议从配置加载而非硬编码allowedHosts : map[string]bool{api.example.com: true, cdn.example.net: true}if _, ok : allowedHosts[host]; !ok {return fmt.Errorf(host not in allowlist: %s, host)}return nil}常见错误现象url.Parse 后只检查 u.Host却忽略 u.Scheme 被设为 file:// 或 ftp://或用 strings.HasPrefix(u.Host, 127.) 这种字符串匹配漏掉 127.0.0.1:8080 或 IPv6 的 ::1。gorilla/handlers.CORS 不能防 SSRF但 SameSite 和 Referer 可辅助判断CORS 是浏览器行为跟 SSRF 完全无关——攻击者根本不用浏览器直接 curl -X POST 构造请求即可绕过所有前端限制。真正有用的辅助手段只有两个Referer 头校验需确认你允许的来源可信和 SameSiteStrict Cookie 设置防止跨站带认证态发起 SSRF 请求。但注意SameSite 对纯 API 场景无效且不能替代 URL 白名单。立即学习“go语言免费学习笔记深入” RedClaw 百度推出的手机端万能AI Agent助手

更多文章