接口防刷,golang 生成数字验证码图片,基于 base64Captcha

更新日期: 2024-11-26 阅读次数: 66 字数: 633 分类: golang

在网站登录时,需要增加一个验证码图片。不需要复杂的验证,简单的数字,或者英文字母验证即可。 找了一下发现一个 golang 的实现。

三方库

https://github.com/mojocn/base64Captcha

效果如下:

golang 生成图片验证码,基于 base64Captcha

支持:

  • 数字验证码
  • 公式
  • 字母
  • 汉字
  • 音频

安装

> go get -u github.com/mojocn/base64Captcha

生成验证码图片

实际上是生成了一个 base64 格式的图片,测试了一下,大小为 1K 左右。

以 golang gin 框架为例:

import "github.com/mojocn/base64Captcha"

var captchaStore = base64Captcha.DefaultMemStore

func GetCaptcha(c *gin.Context) {
	driver := base64Captcha.DefaultDriverDigit
	captcha := base64Captcha.NewCaptcha(driver, captchaStore)
	id, b64s, _, _ := captcha.Generate()
	//fmt.Println(id)
	c.JSON(http.StatusOK, gin.H{
		"err_code": 0,
		"err_msg":  "OK",
		"data": gin.H{
			"captchaId": id,
			"image":     b64s,   // base64 格式的图片
		},
	})
}

生成的图片效果:

base64 图片数字验证码

大小写问题

https://github.com/mojocn/base64Captcha/issues/127

从反馈的 github issue 看,确实存在字母大小写不易分辨的问题。我觉得先不使用字母,仅仅用数字即可。 毕竟,目前这个网站没有被刷的价值。

过期时间

为了方便部署,我选择了默认的内存存储。而没有采用 redis。 但是在内存中,总不能一直占用内存吧。需要确认一下是否有自动的清理机制。

查看源代码文件 store_memory_default.go 可以看到:

package base64Captcha

import "time"

var (
	// GCLimitNumber The number of captchas created that triggers garbage collection used by default store.
	GCLimitNumber = 10240
	// Expiration time of captchas used by default store.
	Expiration = 10 * time.Minute
	// DefaultMemStore is a shared storage for captchas, generated by New function.
	DefaultMemStore = NewMemoryStore(GCLimitNumber, Expiration)
)

存储总数量,和过期时间(10分钟),都做了默认设置。

一个 captcha id 是否会被重复使用

主要是为了防止校验通过的 captcha 被重复使用。

// 校验验证码
verify := captchaStore.Verify(request.CaptchaId, request.Captcha, true)

第三个参数,就是 clear 标识。即,调用校验接口之后,是否清理对应的验证码。

实际测试发现,无论校验是否成功,都会清除对应的验证码。非常好,是合理的。

更多有趣的库

搜索 golang captcha 会发现,还有不少实现,甚至类似于 google recaptcha 的实现。例如:

https://github.com/wenlng/go-captcha

golang captcha

目前没有使用场景就没有测试,后续有机会尝试一下。(发送短信验证码时,可以加上)

微信关注我哦 👍

大象工具微信公众号

我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式