golang gin base64Captcha生成验证码后通过redis存储 以及安全验证思路
package main
import (
"github.com/gin-gonic/gin"
"github.com/mojocn/base64Captcha"
"github.com/go-redis/redis"
"time"
"crypto/md5"
"encoding/hex"
)
var redisClient *redis.Client
func init() {
redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 无密码
DB: 0, // 默认数据库
})
}
func main() {
r := gin.Default()
// 生成验证码的处理函数
r.GET("/captcha", func(c *gin.Context) {
// 生成验证码
captchaId, capValue, imgBuf := base64Captcha.GenerateCaptcha(320, 48, base64Captcha.ALL)
// 计算验证码的MD5,用于存储时的key
md5Ctx := md5.New()
md5Ctx.Write([]byte(capValue))
md5Value := hex.EncodeToString(md5Ctx.Sum(nil))
// 存储验证码到Redis,设置过期时间
err := redisClient.Set(md5Value, capValue, time.Minute*5).Err()
if err != nil {
c.String(500, "Error saving captcha to Redis")
return
}
// 返回验证码ID和图片数据
c.JSON(200, gin.H{
"captchaId": captchaId,
"imageData": imgBuf.String(),
})
})
// 验证验证码的处理函数
r.GET("/verifyCaptcha", func(c *gin.Context) {
captchaId := c.Query("captchaId")
captchaValue := c.Query("captchaValue")
// 从Redis获取验证码
md5Value, err := redisClient.Get(captchaId).Result()
if err != nil {
c.String(404, "Captcha not found or expired")
return
}
// 比对验证码值,注意需要对比原始值,不是MD5
if md5Value == captchaValue {
c.String(200, "Captcha verified successfully")
} else {
c.String(401, "Captcha verification failed")
}
})
r.Run(":8080")
}
这段代码首先初始化了一个Redis客户端用于与Redis服务器交互。然后,在HTTP服务器中定义了两个路由:/captcha
用于生成新的验证码并将其存储到Redis,/verifyCaptcha
用于验证用户输入的验证码值。在生成验证码时,我们计算了验证码的MD5值作为Redis中的key,存储时间设置为5分钟,并在验证时比对用户输入的验证码值。这样做可以防止用户直接猜测或缓存验证码的值。
评论已关闭