buffalo框架不内置防盗链逻辑,需手动实现referer白名单校验或动态签名url验证,或交由nginx/cdn处理;推荐混合使用多种策略以兼顾安全性与性能。

Referer 白名单校验必须手动写 middleware
Buffalo 默认不解析或校验 Referer 请求头,你需要自己写一个中间件,在静态资源路由前检查来源是否合法:
- 只对特定路径生效,比如
/uploads/*或/assets/* - 用
c.Request().Header.Get("Referer")获取值,注意空值和协议不一致(http://vshttps://)问题 - 不要用
strings.Contains粗暴匹配,应使用url.Parse提取 host 后比对域名(避免被evil.com/yourdomain.com绕过) - 校验失败时返回
403 Forbidden,而不是重定向或静默忽略
动态签名 URL 需配合 time + HMAC 在 handler 中生成与验证
如果你返回的是临时可访问链接(如 /download/photo.jpg?exp=1726842000&sig=abc123),签名逻辑必须前后端一致,且不能暴露密钥:
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
- 服务端生成链接时:拼接原始路径 + 过期时间戳 + 密钥,用
hmac.Sum256算出签名,base64 或 hex 编码后作为sig参数 - 资源 handler 中:重新计算签名,比对请求中的
sig;同时检查exp是否已过期(用time.Now().Unix()判断) - 密钥必须从环境变量读取,绝不可硬编码在代码里;签名字符串建议固定格式,例如
path:exp:secret - 注意:Buffalo 的
c.Param("file")只能拿到路径,查询参数要用c.Param("exp")和c.Param("sig"),或更稳妥地用c.Request().URL.Query().Get("exp")
Nginx 做 Referer 过滤比 Buffalo 更高效
如果静态资源走的是 Buffalo 直出(即没经 CDN),又不想在 Go 层加逻辑,Nginx 是更轻量、更可靠的选择:
- 在
location块中用valid_referers指令定义白名单,例如:valid_referers none blocked server_names *.myapp.com; - 后面跟
if ($invalid_referer) { return 403; },注意 Nginx 的if在location内才安全 - 该方式不消耗 Buffalo 的 goroutine,也不受 Go runtime GC 影响,适合高并发小图场景
- 缺点:无法做动态签名校验,也无法记录非法请求日志到你的应用系统










