图形验证码 captcha的使用

Posted 随心的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图形验证码 captcha的使用相关的知识,希望对你有一定的参考价值。

使用效果:

 

 

使用说明:

1、点击图片 或者 点击看不清 换一张,会自动更换。

  2、输入错误,也会自动再更换一张。确保安全

 

验证码文件:common/captcha.go 

package common

import (
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"github.com/mojocn/base64Captcha"
	"image/color"
	"net/http"
)

var store = base64Captcha.DefaultMemStore
// 获取验证码
func GetCaptcha(c *gin.Context) 
	//配置验证码
	driverString := base64Captcha.DriverString
		Height:          60,
		Width:           200,
		NoiseCount:      0,     //噪点数
		ShowLineOptions: 2 | 4, //干扰线
		Length:          4,
		Source:          "123456789abcdefghijklmnopqrstuvwxwz",
		BgColor: &color.RGBA
			R: 100,
			G: 100,
			B: 100,
			A: 100,
		,
		Fonts: []string"wqy-microhei.ttc",
	

	var driver base64Captcha.Driver = driverString.ConvertFonts()
	//生成验证码
	cap := base64Captcha.NewCaptcha(driver, store)
	id, b64s, err := cap.Generate()
	body := map[string]interface"code": 1, "data": b64s, "captchaId": id, "msg": "success"
	if err != nil 
		body = map[string]interface"code": 0, "msg": err.Error()
	
	c.JSON(http.StatusOK, body)


// 自定义验证码的验证器
func VerifyCaptcha(f validator.FieldLevel) bool 
	captcha := f.Parent().FieldByName("Captcha").Interface().(string)
	captcha_id := f.Parent().FieldByName("CaptchaId").Interface().(string)

	if store.Verify(captcha_id, captcha, true) 
		return true
	
	return false

 

Html调用代码:

<div class="row cl">
<div class="formControls col-xs-8 col-xs-offset-3">
<input name="captcha" id="captcha" class="input-text size-L" type="text" placeholder="验证码" onblur="if(this.value==\'\')this.value=\'验证码:\'" onclick="if(this.value==\'验证码:\')this.value=\'\';" value="验证码:" >
<img id="captcha_img" src="/admin/getCaptcha" onclick="showCaptcha()" >
 <input type="hidden" name="captcha_id" id="captcha_id" />
<a id="kanbuq" href="javascript:showCaptcha();">看不清,换一张</a>
</div>
 </div>


<script type="text/javascript" src="/static/h-ui.lib/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" >
//显示验证码
    function showCaptcha()
        $.get("/admin/getCaptcha",function (res)
            $("#captcha_img").attr("src",res.data)
            $("#captcha_id").val(res.captchaId)

        )
    
showCaptcha()
</script>

  完结

NodeJs生成SVG图形验证码

背景:短信接口有调用限制,如果受到恶意攻击,很容易就爆掉,所以需要一系列验证机制,后端采用签名加密的方式,而前端要做人机识别,有两个要求:

1)不能使用文本式的验证码,很简单就能拿到

2)所有验证逻辑要在服务端进行,不然很容易被绕过

解决方法:使用svg-captcha插件在node.js中生成svg格式的验证码。

1、安装

npm install --save svg-captcha

2、使用方法

var svgCaptcha = require(‘svg-captcha‘);
var data = svgCaptcha.create({
   //options 
})
console.log(data)
//{data: ‘<svg>......</svg>‘, text: ‘fdsafasdf‘}

在express中使用

var svgCaptcha = require(‘svg-captcha‘);
var router = require(‘express‘).Router();

router.get(‘/get-img-verify‘, function (req, res) {
    console.log(req.query);
    var option = req.query;
    // 验证码,有两个属性,text是字符,data是svg代码
    var code = svgCaptcha.create(option);
    // 保存到session,忽略大小写
    req.session["randomcode"] = code.text.toLowerCase();
    // 返回数据直接放入页面元素展示即可
    res.send({
        img: code.data
    });
});

客户端获取验证码

/*
     * 获取图片验证码
     */
    getImageCode: function () {
        var _this = this;
        $("#image_code").val("");
        $.ajax({
            type:"get",
            url: "/get-img-verify",
            data: {         
                size: 6,  //验证码长度
                width: 200,
                height: 150,
                background: "#f4f3f2",//干扰线条数
                noise: 2,
                fontSize: 32,
                ignoreChars: ‘0o1i‘,   //验证码字符中排除‘0o1i‘
                color: true // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有           
            },
            dataType: ‘json‘
        }).done(function (data) {
            $(".getImageCode").html(data.img);
            $(".getImageCode").off("click").on("click", function () {
                _this.getImageCode();
            });
        });
    }                            

3、验证方法

所有的验证逻辑都要在服务端进行,不然这个验证码就没什么卵用了,所以正确的逻辑应该是,当去请求敏感接口的时候,把客户端输入的验证码连同接口需要的参数一块传给node层,在node里判断用户输入的验证码是不是跟之前存到session里的验证码一致,如果不一致,则验证不通过,直接返回数据,不请求后台;如果一致,则验证通过,再由node发起请求,去调用后台接口。

router.get(‘/cerification-codeService/send-verification-code‘, function (req, res, next) {
    var url = urlMap.useraccountserver + ‘/cerification-codeService/new-send-verification-code‘;
    var imageCode = req.query.imageCode.toLowerCase();
    var qs = req.query;
    for (let key in qs) {
        if (key === ‘imageCode‘) {
            delete qs[key];
        }
    }
    if (imageCode !== req.session["randomcode"]) {
        res.send({
            code: 4
        });
        return false;
    }
    var options = {
        url: url,
        method: ‘GET‘,
        json: true,
        qs: qs
    };

    clusterUtility.API.optionsFilter(req, options);
    request(options, function (error, response, body) {
        res.send(body);
    });
});

插件还有一些其他的配置项及API,具体可见  https://github.com/lemonce/svg-captcha

以上是关于图形验证码 captcha的使用的主要内容,如果未能解决你的问题,请参考以下文章

NodeJs生成SVG图形验证码

二.图形验证码

JQ-用户注册用到的图形验证码和短信验证码点击事件

图形验证逻辑

验证码这样做,瞬间高出一个逼格

验证码这样做,瞬间高出一个逼格!