接口防刷:图形验证码

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

相关文章

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

基于Redisson实现分布式系统下的接口限流

《基于Redisson实现分布式系统下的接口限流》在高并发场景下,接口限流是保障系统稳定性的重要手段,本文将介绍利用Redisson结合Redis实现分布式环境下的接口限流,具有一定的参考价值,感兴趣... 目录分布式限流的核心挑战基于 Redisson 的分布式限流设计思路实现步骤引入依赖定义限流注解实现

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

SpringBoot+Redis防止接口重复提交问题

《SpringBoot+Redis防止接口重复提交问题》:本文主要介绍SpringBoot+Redis防止接口重复提交问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录前言实现思路代码示例测试总结前言在项目的使用使用过程中,经常会出现某些操作在短时间内频繁提交。例

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP