接口防刷:图形验证码

2024-04-12 16:28
文章标签 接口 图形 验证码 防刷

本文主要是介绍接口防刷:图形验证码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、背景介绍

二、设计思路

三、核心代码展示

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、背景介绍

重置密码,会给用户手机号发送一个短信验证码,因为该接口是未登录就可以访问,所以存在防刷风险。还会遇到未申请重置密码的用户,收到了重置密码的短信。

二、设计思路

1、通过用户有效性,能拦截大部分用户不存在的请求,但是会对已存在的用户,发送短信。

2、针对上边这种解决方案,查漏补缺,不能让请求直接穿透我们的逻辑。此时,图形验证码就登场了。

首先,这个东西是免费的,我们可以后台生成一个图形验证码,并返回给前端进行展示,真实的图形验证码存放在缓存中,并设置过期时间。

其次,每次提交的时候,先用手机号校验一层,验证该手机号当前是否有生效中的图形验证码,如果有,继续向下。如果没有,返回提示。

最后,当有生效的图形验证码存在时,校验前端传递的验证码值和缓存中的是否一致。不一致返回提示,一致的话,向下执行核心逻辑,发送短信验证码。

如果出现图形验证码被攻破的场景,我们只需要变换图形验证码的难易程度和复杂度,即可快速升级防刷级别。

三、核心代码展示

1、生成图形验证码的代码示例

public String generateCaptcha() {// 创建空白图像BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.getGraphics();// 设置背景色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, WIDTH, HEIGHT);// 绘制随机字符Random random = new Random();StringBuilder captcha = new StringBuilder();for (int i = 0; i < CHAR_NUM; i++) {char c = (char) (random.nextInt(26) + 'A'); // 生成随机大写字母captcha.append(c);graphics.setFont(new Font("Arial", Font.BOLD, FONT_SIZE));graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));graphics.drawString(String.valueOf(c), i * (WIDTH / CHAR_NUM) + 20, HEIGHT / 2);}// 添加干扰线和噪点graphics.setColor(Color.GRAY);for (int i = 0; i < 10; i++) {int x1 = random.nextInt(WIDTH);int y1 = random.nextInt(HEIGHT);int x2 = random.nextInt(WIDTH);int y2 = random.nextInt(HEIGHT);graphics.drawLine(x1, y1, x2, y2);}for (int i = 0; i < 100; i++) {int x = random.nextInt(WIDTH);int y = random.nextInt(HEIGHT);graphics.fillOval(x, y, 2, 2);}// 释放资源graphics.dispose();return captcha.toString();
}

2、给前端返回图形验证码,用于展示的代码示例,不一样的地方在于,返回的内容不一样。

    public String generateCaptcha() {// 创建空白图像BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);Graphics graphics = image.getGraphics();// 设置背景色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, WIDTH, HEIGHT);// 绘制随机字符Random random = new Random();StringBuilder captcha = new StringBuilder();for (int i = 0; i < CHAR_NUM; i++) {char c = (char) (random.nextInt(26) + 'A'); // 生成随机大写字母captcha.append(c);graphics.setFont(new Font("Arial", Font.BOLD, FONT_SIZE));graphics.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));graphics.drawString(String.valueOf(c), i * (WIDTH / CHAR_NUM) + 20, HEIGHT / 2);}// 添加干扰线和噪点graphics.setColor(Color.GRAY);for (int i = 0; i < 10; i++) {int x1 = random.nextInt(WIDTH);int y1 = random.nextInt(HEIGHT);int x2 = random.nextInt(WIDTH);int y2 = random.nextInt(HEIGHT);graphics.drawLine(x1, y1, x2, y2);}for (int i = 0; i < 100; i++) {int x = random.nextInt(WIDTH);int y = random.nextInt(HEIGHT);graphics.fillOval(x, y, 2, 2);}// 释放资源graphics.dispose();// 保存图像到文件try {File outputfile = new File("captcha.png");ImageIO.write(image, "png", outputfile);return outputfile.} catch (Exception e) {e.printStackTrace();}return 文件的字节流;
}

获取图形验证码的功能,也不用拘泥于一个手机号新生成一个验证码,这个是对资源的浪费。

我们可以预生成一千个、一万个,然后将其存放于缓存中,直接随机从其中读取即可。

那么有人就会问了,这个如果都是固定的,也会被记忆并攻破,可以每隔一段时间,更新一下验证码的库,这样就能保证我们的库是准实时变化的。


总结

动动脑,能防老!

这篇关于接口防刷:图形验证码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/897641

相关文章

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

Python实现自动化接收与处理手机验证码

《Python实现自动化接收与处理手机验证码》在移动互联网时代,短信验证码已成为身份验证、账号注册等环节的重要安全手段,本文将介绍如何利用Python实现验证码的自动接收,识别与转发,需要的可以参考下... 目录引言一、准备工作1.1 硬件与软件需求1.2 环境配置二、核心功能实现2.1 短信监听与获取2.

Flask 验证码自动生成的实现示例

《Flask验证码自动生成的实现示例》本文主要介绍了Flask验证码自动生成的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习... 目录生成图片以及结果处理验证码蓝图html页面展示想必验证码大家都有所了解,但是可以自己定义图片验证码

如何用java对接微信小程序下单后的发货接口

《如何用java对接微信小程序下单后的发货接口》:本文主要介绍在微信小程序后台实现发货通知的步骤,包括获取Access_token、使用RestTemplate调用发货接口、处理AccessTok... 目录配置参数 调用代码获取Access_token调用发货的接口类注意点总结配置参数 首先需要获取Ac

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

SpringBoot集成图片验证码框架easy-captcha的详细过程

《SpringBoot集成图片验证码框架easy-captcha的详细过程》本文介绍了如何将Easy-Captcha框架集成到SpringBoot项目中,实现图片验证码功能,Easy-Captcha是... 目录SpringBoot集成图片验证码框架easy-captcha一、引言二、依赖三、代码1. Ea

Python自动化处理手机验证码

《Python自动化处理手机验证码》手机验证码是一种常见的身份验证手段,广泛应用于用户注册、登录、交易确认等场景,下面我们来看看如何使用Python自动化处理手机验证码吧... 目录一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取