大佬好,验证码校验貌似有bug,在清除后二次验证时会返回true
zhangbest5 opened this issue · 3 comments
zhangbest5 commented
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的菜鸟一枚,再者,大佬您这文档真是没法看啊,啥啥看不懂,我这还是看知了课堂里的老师教给用的
Luckyboys commented
@mojocn 哥,我看了一下 memoryStore
的 Verify
的代码,发现的确会有一个情况是会出现验证会返回 true
的。
其实只要那个 digitsById
的 Key 不存在,Get
方法就会返回一个空白字符串
然后如果传入到 Verify
的 answer
参数是空白字符串的话,就会返回 true
的情况。
所以其实我们 memoryStore
.Verify
方法的 answer
,有一个默认前提是需要非空字符串。
所以这里可能要么就是在 Store 里面实现,先校验非空(这就的确有点傻,所有的 Store 都得校验),要么就是需要提示使用者需要提前校验字符串为非空字符串。
zhangbest5 commented
@Luckyboys 大佬明鉴,确实,对比应该默认返回个false,但默认返回个true
@mojocn 请大佬再仔细看看