Go 框架中的 CSRF 防御机制包括:生成令牌、验证令牌和存储令牌于浏览器或 Cookie,从而防止攻击者通过受害者浏览器向目标网站发送验证请求。
跨域请求伪造 (CSRF) 是一种攻击技术,它能让攻击者通过受害者的浏览器向目标网站发送经过身份验证的请求,而受害者并不知情。
Go 框架 (如 Gin、Echo) 提供了内置机制来防御 CSRF 攻击。这些机制的工作原理是为每个 HTTP 请求生成一个唯一的随机令牌,并将其存储在用户的浏览器中或 HTTP 响应的 Cookie 中。当用户向服务器发送 HTTP 请求时,令牌将随请求一起发送。服务器会验证令牌,只有令牌匹配时才会处理请求。
以下是一个使用 Gin 框架防止 CSRF 攻击的示例:
// CSRF 中间件 func CSRFMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 从请求头中获取令牌 token := c.Request.Header.Get("X-CSRF-Token") // 从会话中获取令牌 sessionToken := c.MustGet("csrf_token").(string) // 比较令牌 if token != sessionToken { // 令牌不匹配,返回错误 c.AbortWithStatus(http.StatusForbidden) return } // 令牌匹配,继续处理请求 c.Next() } } func main() { router := gin.Default() // 添加 CSRF 中间件 router.Use(CSRFMiddleware()) // 设置 csrf_token 会话值 router.Use(func(c *gin.Context) { c.Set("csrf_token", uuid.New().String()) c.Next() }) router.GET("/", func(c *gin.Context) { // 渲染主页并传递 CSRF 令牌 c.HTML(http.StatusOK, "index.html", gin.H{"csrf_token": c.MustGet("csrf_token").(string)}) }) router.POST("/submit", func(c *gin.Context) { // 验证令牌 if c.Request.Header.Get("X-CSRF-Token") != c.MustGet("csrf_token").(string) { c.AbortWithStatus(http.StatusForbidden) return } // 处理表单提交 c.JSON(http.StatusOK, gin.H{"success": true}) }) router.Run() }
除了使用令牌外,还有其他方法可以防御 CSRF 攻击: