前言
公司在一次投票活动中,发现有用户恶意刷票。有两种方式:1.直接拿接口刷。2.通过一种专门的刷票软件工具(猜测使用的是手机集控系统批量操作),先注册机器人用户,然后用这个用户进行投票。
第一种方法是自己接口的漏洞,没有限制一人一票。导致被别人注册一个用户后,拿到接口用同一个用户恶意刷票,这个很好防范。第二种方法本质上操作流程上跟真实用户的操作流程是一样的,只不过他用软件实现了自动化。在注册用户这个功能上,我们之前是用手机验证码来做注册验证的,可是机器是可以拿到发送的验证码,并反填。所以我们针对这种情况,加一个图片验证码,增加注册难度,防止机器恶意注册。
图片验证码方案选择
图片验证码有很多种形式。最常见的有三种:
- 第一种形式比较简单就是最原始的给定一个杂乱的图片,然后在框内填入符合验证码里面的字符
- 第二张形式是类似12306网站的验证码
- 第三种形式是现在比较流行的滑块验证码
第一种形式比较简单,现在的机器学习技术很容易识别攻破,主流的网站已经不采用这种比较过时的方式了。第二张方式现在用的比较多,但是需要准备大量的图片,并且要对这些图片进行分类,很费时费力,在实现成本上比较高。第三种方式现在用的也比较多,同样也需要准备很多图片,并对这些图片切片匹配。
如果采用第二种或者第三种方式都是需要UI参与,UI花费的时间很多。为了实现不需要UI参与,加快开发进度。我们打算采用第二种方式的变种方案:通过Kaptcha组件生成8张带中文字符的验证码,并且合成一张图片。并在这八个字符中随机选择需要验证的四个字,在session中记录这四个字在绘制图片中的起始坐标。前端点击选择图片中的四个文字,返回给后端点击坐标,后端验证坐标是否正确。正确则验证成功,否则失败。
导入Kaptcha
你需要有一个可执行的springboot项目。
maven导入kaptcha的方式
Gradle导入kaptcha的方式
我使用Gradle导入
准备字库
在网上找了3500常用字字库导入到数据库里面常用3500汉字EXCEL数据库
配置Kapthca
|
|
合成图片
|
|
将合成的8个字随机抽取4个字的坐标作为要验证的坐标并存入session
|
|
前端返回坐标后端验证
|
|