首页 景点排名文章正文

Go语言实战案例:简易图像验证码生成

景点排名 2025年09月27日 15:44 2 admin

在 Web 应用中,验证码(CAPTCHA)常用于防止机器人批量提交请求,比如注册、登录、评论等功能。

本篇我们将使用 Go 语言和 Gin 框架,结合第三方库 github.com/mojocn/base64Captcha ,快速实现一个 简易图像验证码生成接口 。


一、功能目标

  1. 提供一个生成验证码的 API,返回验证码图片(Base64 编码)和验证码 ID。
  2. 前端展示验证码图片,并在提交时携带验证码 ID 和用户输入。
  3. 提供一个校验验证码的 API。

二、安装依赖

首先安装 Gin 和 Base64Captcha:

go get github.com/gin-gonic/gingo get github.com/mojocn/base64Captcha

#技术分享三、代码实现

package mainimport ( "github.com/gin-gonic/gin" "github.com/mojocn/base64Captcha" "net/http" )var store = base64Captcha.DefaultMemStorefunc generateCaptcha(c *gin.Context) { driver := base64Captcha.NewDriverDigit(80, 240, 5, 0.7, 80) captcha := base64Captcha.NewCaptcha(driver, store) id, b64s, err := captcha.Generate() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "验证码生成失败"}) return }c.JSON(http.StatusOK, gin.H{ "captcha_id": id, "captcha_image": b64s, }) }func verifyCaptcha(c *gin.Context) { var req struct { ID string `json:"id"` Value string `json:"value"` } if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return }if store.Verify(req.ID, req.Value, true) { c.JSON(http.StatusOK, gin.H{"message": "验证成功"}) } else { c.JSON(http.StatusBadRequest, gin.H{"message": "验证码错误"}) } }func main() { r := gin.Default() r.GET("/captcha", generateCaptcha) r.POST("/verify", verifyCaptcha) r.Run(":8080") }

四、运行与测试

运行服务:

go run main.go

1. 获取验证码

curl http://localhost:8080/captcha

返回:

{  "captcha_id": "ZffX7Xr7EccGdS4b",  "captcha_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhE..."}

前端可直接用 <img src="captcha_image" /> 渲染验证码。


2. 校验验证码

curl -X POST http://localhost:8080/verify \  -H "Content-Type: application/json" \  -d '{"id":"ZffX7Xr7EccGdS4b","value":"12345"}'

五、注意事项

  1. 验证码存储
  2. 本示例使用内存存储,适合单机开发环境。
  3. 生产环境建议使用 Redis 等共享存储。
  4. 验证码类型 base64Captcha 支持数字、字母混合、中文等类型,可以根据业务需求选择不同 Driver
  5. 安全性
  6. 不能把验证码 ID 暴露给爬虫(可配合 CSRF、限流等手段)。
  7. 验证码要有有效期,防止重放攻击。

六、总结

使用 base64Captcha 结合 Gin,可以非常方便地生成和校验验证码。本篇示例已经可以直接应用到注册、登录等防刷场景中。


发表评论

长征号 Copyright © 2013-2024 长征号. All Rights Reserved.  sitemap