mojocn/base64Captcha

大佬好,验证码校验貌似有bug,在清除后二次验证时会返回true

zhangbest5 opened this issue · 3 comments

package utils

import (
	"github.com/mojocn/base64Captcha"
	"image/color"
)

type Captcha struct {
	Id   string
	BS64 string
	Code int
}

// 定义共同使用的存储
var store = base64Captcha.DefaultMemStore

// GetCaptcha 生成验证码
func GetCaptcha() (id string, base64 string, err error) {
	rgbaColor := color.RGBA{0, 0, 0, 0}
	fonts := []string{"wqy-microhei.ttc"}
	//生成driver,高,宽,背景文字的干扰,画线的条数,背景颜色的指针,字体仓库(nil为默认),字体切片(可以使用多种字体)
	driver := base64Captcha.NewDriverMath(50, 140, 0, 1, &rgbaColor, nil, fonts)

	//使用前面的driver和store 生成验证码的实例
	captcha := base64Captcha.NewCaptcha(driver, store)

	//生成验证码
	id, base64, err = captcha.Generate()
	return id, base64, err
}

// VerityCaptcha 校验验证码
func VerityCaptcha(id string, ret_captcha string) bool {
	return store.Verify(id, ret_captcha, ture) //clear 为ture 时只验证一次就销毁了,会有bug返回为true ,false不销毁
}
//调用时
func (l *LoginController) Post() {
	username := l.GetString("username")
	password := l.GetString("password")
	captcha := l.GetString("captcha")
	captcha_id := l.GetString("captcha_id")

	//验证码校验
	fmt.Println("captcha:",captcha)
	is_ok := utils.VerityCaptcha(captcha_id, captcha)
	fmt.Println("is_ok:",is_ok)
//我在页面上不输入验证码,第一次返回正确false,第二次返回就true了
captcha: 
is_ok: false
2021/07/29 10:35:11.541 [D] [router.go:925]  |      127.0.0.1| 200 |     7.3549ms|   match| POST     /     r:/
captcha: 
is_ok: true

刚学习go的菜鸟一枚,再者,大佬您这文档真是没法看啊,啥啥看不懂,我这还是看知了课堂里的老师教给用的

@mojocn 哥,我看了一下 memoryStoreVerify的代码,发现的确会有一个情况是会出现验证会返回 true的。

其实只要那个 digitsById的 Key 不存在,Get 方法就会返回一个空白字符串

然后如果传入到 Verifyanswer 参数是空白字符串的话,就会返回 true 的情况。

所以其实我们 memoryStore.Verify 方法的 answer,有一个默认前提是需要非空字符串。

所以这里可能要么就是在 Store 里面实现,先校验非空(这就的确有点傻,所有的 Store 都得校验),要么就是需要提示使用者需要提前校验字符串为非空字符串。

@Luckyboys 大佬明鉴,确实,对比应该默认返回个false,但默认返回个true
@mojocn 请大佬再仔细看看