Go1.25通过Headers实现CSRF防护

 更新时间:2026年06月01日 15:30:27   作者:golang学习记  
Go 1.25 引入的利用现代浏览器的 Headers 机制,大幅简化了 CSRF 防护的实现,相比传统的 Token 方案,它无需修改表单模板,只需在应用层统一配置即可,下面就来详细的了解一下

跨站请求伪造(CSRF)是一种常见的 Web 安全攻击。当用户登录了银行网站后,又访问了一个恶意网站 fake-bank.com,该恶意网站可能显示如下表单:

<form action="https://bank.com/transfer" method="post">
  <input type="hidden" name="amount" value="1000">
  <input type="hidden" name="recipient" value="hacker-account">
  <input type="submit" value="联系客服">
</form>

攻击者的目标是诱骗用户点击"联系客服"按钮,但实际上表单会被提交到银行网站。由于浏览器会自动携带用户已认证的 Cookie,银行网站会认为这是合法请求,从而执行转账操作。

传统的 CSRF 防护方案

传统防护方法需要服务器生成一个 CSRF Token,同时存储在 Cookie 和表单隐藏字段中。提交表单时,服务器验证两个 Token 是否匹配。这种方法有效的原因是恶意网站无法读取用户的 Cookie,因此无法构造正确的隐藏字段。

但这种方案存在明显缺点:

  1. 开发成本高:需要为每个表单添加 CSRF Token 字段
  2. 维护负担:通常依赖第三方库,可能存在维护问题

现代浏览器的 Headers 防护方案

现代浏览器新增了一些 Headers,可用于 CSRF 防护:

Sec-Fetch-Site Header

这个 Header 告诉我们请求是否跨域:

  • same-sitenone:表示非跨域请求,无需 CSRF 防护
  • 其他值或缺失:需要结合 Origin Header 进一步验证

Origin Header

表示发起请求的网站来源。例如,如果在 https://fake-bank.com 点击链接,Origin Header 会设置为该域名。服务器可以通过验证 Origin 是否在白名单内来判断请求是否合法。

如果两个 Header 都不存在,通常认为是非浏览器客户端(如 API 测试工具),此时不强制 CSRF 防护。

优势

  • 实现简单,无需修改表单
  • 无需维护 CSRF Token 和 Cookie

限制

  • 需要较新的浏览器(2023 年后发布的版本支持较好)

Go 1.25 中的 CrossOriginProtection

Go 1.25 在 net/http 包中新增了 CrossOriginProtection 类型,采用上述 Headers 方案提供 CSRF 防护。

基本用法

mux := http.NewServeMux()
mux.HandleFunc("/", homePageHandler)
mux.HandleFunc("POST /login", loginHandler)
// 更多路由...

// 创建 CSRF 防护
csrfProtection := http.NewCrossOriginProtection()
// 允许来自 client 子域的跨站请求
csrfProtection.AddTrustedOrigin("https://client.xx.com")

// 包装处理器
handler := csrfProtection.Handler(mux)

// 启动服务
http.ListenAndServe(":8080", handler)

此配置允许同域请求,以及来自 https://client.xx.com 的跨站请求。

测试验证

使用 curl 测试不同场景:

1. 同域请求(通过):

curl -v -X POST \
  -H "sec-fetch-site:same-origin" \
  localhost:8080/login

2. 信任的跨域来源(通过):

curl -v -X POST \
  -H "sec-fetch-site:same-site" \
  -H "origin:https://client.xx.com" \
  localhost:8080/login

3. 未信任的跨域来源(拒绝):

curl -v -X POST \
  -H "sec-fetch-site:same-site" \
  -H "origin:https://bob.xx.com" \
  localhost:8080/login

4. 旧版浏览器(仅 Origin):

curl -v -X POST \
  -H "origin:https://client.xx.com" \
  localhost:8080/login

5. 非浏览器客户端(通过):

curl -v -X POST localhost:8080/login

使用限制

当前 CrossOriginProtection 有一些限制:

  • 不支持通配符:无法使用 https://*.calhoun.io 匹配所有子域,必须逐个添加
  • 路径级豁免AddInsecureBypassPattern 方法用于特定路径豁免 CSRF 防护,如 OAuth 回调:
csrfProtection.AddInsecureBypassPattern("/oauth")

这会允许任何来源访问 /oauth 路径,适用于需要接受第三方回调的场景。

总结

Go 1.25 引入的 CrossOriginProtection 利用现代浏览器的 Headers 机制,大幅简化了 CSRF 防护的实现。相比传统的 Token 方案,它无需修改表单模板,只需在应用层统一配置即可。虽然对浏览器版本有一定要求,但对于大多数现代 Web 应用来说,这是一种简洁高效的防护方案。

到此这篇关于Go1.25通过Headers实现CSRF防护的文章就介绍到这了,更多相关Go CSRF防护内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang实现JWT身份验证的示例详解

    Golang实现JWT身份验证的示例详解

    JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间安全地传输声明,本文主要为大家详细介绍了Golang实现JWT身份验证的相关方法,希望对大家有所帮助
    2024-03-03
  • Go语言实现动态开点线段树详解

    Go语言实现动态开点线段树详解

    线段树是一种用于高效处理区间查询和区间更新的数据结构,下面我们就来看看如何使用Go实现动态开点线段树的方式,感兴趣的可以了解下
    2025-02-02
  • golang使用信号量热更新的实现示例

    golang使用信号量热更新的实现示例

    这篇文章主要介绍了golang使用信号量热更新的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 使用Go语言实现发送微信群消息

    使用Go语言实现发送微信群消息

    这篇文章主要为大家详细介绍了如何使用Go语言实现发送微信群消息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • go语言解决并发问题小结

    go语言解决并发问题小结

    并发是GO最基本的功能了,但是在传统的PHP中是比较困难的,如果不借助其它一些扩展的话,是做不到并发的,这篇文章主要介绍了go语言如何解决并发问题,需要的朋友可以参考下
    2024-05-05
  • Go语言学习笔记之文件读写操作详解

    Go语言学习笔记之文件读写操作详解

    这篇文章主要为大家详细介绍了Go语言对文件进行读写操作的方法,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-05-05
  • Hugo 游乐场内容初始化示例详解

    Hugo 游乐场内容初始化示例详解

    这篇文章主要为大家介绍了Hugo 游乐场内容初始化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • golang中实现graphql请求的方法

    golang中实现graphql请求的方法

    这篇文章主要介绍了如何在golang中实现graphql请求,在本文中,我们介绍了如何使用gqlgen来构建GraphQL服务,需要的朋友可以参考下
    2023-04-04
  • 浅谈golang并发操作变量安全的问题

    浅谈golang并发操作变量安全的问题

    这篇文章主要介绍了浅谈golang并发操作变量安全的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang如何实现proxy代理简单方法

    golang如何实现proxy代理简单方法

    这篇文章主要给大家介绍了关于golang如何实现proxy代理简单方法的相关资料,Proxy是golang实现的高性能http,https,websocket,tcp,udp,socks5,ss代理服务器,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10

最新评论