📢 转载信息
原文链接:https://simonwillison.net/2025/Oct/15/csrf-in-go/#atom-everything
原文作者:Simon Willison
Go 1.25 引入突破性CSRF防御机制
Alex Edwards 在其文章《A modern approach to preventing CSRF in Go》(通过 Lobste.rs 推荐)中,重点介绍了 Go 标准库在 2024 年 8 月发布的 1.25 版本中新增的 http.CrossOriginProtection
中间件。这引出了一个令人兴奋的问题:
我们是否终于达到了一个可以避免依赖基于令牌的检查(如双重提交 Cookie)来防止 CSRF 攻击的阶段?
答案似乎是“是的”,这非常令人振奋。我个人自 2005 年 5 月(20年前)首次了解到 CSRF 以来,一直在关注这一问题(追踪 CSRF),因此一个比那些笨拙的隐藏表单字段更简洁的解决方案将非常受欢迎。
新机制的工作原理:Sec-Fetch-Site
新的 Go 中间件代码位于 src/net/http/csrf.go。它的工作原理是利用 Sec-Fetch-Site
HTTP 头部。Can I Use 网站数据显示,该头部在全球的可用性达到了 94.18%。主要的遗留系统是 IE11,以及早于 iOS 17 的 iOS 版本(iOS 17 发布于 2023 年,但可安装在 2017 年以来发布的任何手机上),以及其他一些过时的浏览器版本。
- 如果
Sec-Fetch-Site
的值是same-origin
或none
,则表明提交表单的页面与当前页面同源,或用户直接导航而来——这两种情况都是安全的,可以免受 CSRF 攻击。 - 如果值为
cross-site
或same-site
(例如,tools.simonwillison.net
和til.simonwillison.net
被视为same-site
但非same-origin
),则提交将被拒绝。
向后兼容与安全建议
如果缺少 Sec-Fetch-Site
头部,该中间件会退而求其次,比较其他头部:Origin
(例如 https://simonwillison.net
)与 Host
(例如 simonwillison.net
)。这应该可以覆盖那些不支持新头部的极少数浏览器,尽管我不确定是否存在其他奇怪的边缘情况。
需要注意的是,这种回退比较无法考虑协议(scheme),因为 Host
头部不包含该信息。因此,建议管理员使用 HSTS(HTTP 严格传输安全机制)来保护防止 HTTP 到 HTTPS 的跨源请求。
关于 localhost 的说明
我在 Lobste.rs 上曾询问这是否适用于 localhost
,因为 localhost
通常不通过 HTTPS 服务。Firefox 安全工程师 Frederik Braun 向我保证,*.localhost
被视为安全上下文(Secure Context),因此即使未通过 HTTPS 服务,也会获得 Sec-Fetch-Site
头部。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,小白也可以简单操作。
青云聚合API官网https://api.qingyuntop.top
支持全球最新300+模型:https://api.qingyuntop.top/pricing
详细的调用教程及文档:https://api.qingyuntop.top/about
评论区