Java场景面试题:短信验证码接口被狂刷,怎么办?

简介: 问:Tom老师,请问短信验证码接口被狂刷,搞得服务都快要崩溃了,我该怎么办?答:我想都到云时代了,我想这个问题不应该出现吧?现在,都有非常多的短信服务提供商,应该自带防火墙功能的。

问:Tom老师,请问短信验证码接口被狂刷,搞得服务都快要崩溃了,我该怎么办?

答:我想都到云时代了,我想这个问题不应该出现吧?现在,都有非常多的短信服务提供商,应该自带防火墙功能的。


问:不是,他这个所有的验证都是自己开发的,后台只调用了发送短信的接口,而且还导致短信费用瞬间飙升,(如图)后面把入口强行关闭才及时止损,你看看这个是后台的统计结果。

16487fb5a4e14b74491073873cdebab0.png

答:哦,针对于这种情况的话,给以下6点优化建议吧:


第1点是、限制发送短信的时间间隔,比如,规定每隔60秒后才能再次发送。

后台可以记录给每个手机号码发送短信的时间点,在发送短信之前校验一下看时间间隔是否大于60秒。如果小于60秒则直接拒绝响应,只有大于60秒才调用发送短信的接口。

当然,为了提高用户体验,可以在前端页面加一个60秒倒是的提示,没有达到间隔时间限制,将发送按钮置为禁用状态。这种处理方式虽然非常普遍,但技术稍微好点的程序员完全可以绕过这个限制的,还要继续加强防护措施。


所以,第2点,可以设置手机号码发送次数上限。比如,规定同一个手机号在24小时之内不能够超过5条。如果发送超过5条,可以提示用户第2天再操作,或者申请人工服务。当然,加上这条限制也只能够避免人工手动刷短信而已,对于批量使用不同手机号码来刷短信的机器来说,这种方法也是无可奈何的。


所以,第3点、还需要增加图形验证码校验。比如,同一个IP地址,或者同一个手机号码,连续发送3条以上,就需要输入图形验证码才能触发发送短信的动作。这样,又能拦截一大批恶意请求。但是,如果恶意刷短信的手机号码够多,代理IP也够多,还是有存在风险。


所以,为了继续加强保护,可以增加第4点、控制短信验证码接口的调用频次:比如,说30分钟之内,同一个IP,同一个手机号只发送同一个验证码。也就是说,将第一次请求短信接口的验证码结果缓存到服务器本地,只要是在30分钟之内再次请求,就直接返回缓存中的结果。当然,有些特殊业务场景是不能允许这样设计的,比如,银行转账的短信验证接口。


所以,还可以增加第5点、加上前后端请求唯一性校验,比如给每一次请求加上token参数校验。在前端页面请求发送短信的时候,同时,要携带一个由服务器生成的token参数,服务端对这个token参数进行校验,校验通过之后,再向请求发送短信的接口向用户手机发送短信。


最后,为了避免后台服务过多地处理无效请求,还可以再增加第6点、设置黑名单,比如,将频繁请求的IP地址和手机号码直接加入黑名单,禁止请求服务接口。当然,如果是系统误判,误入黑名单,也可以找人工解禁。


以上就是我针对于短信验证码接口被狂刷的解决方案,各位汤粉如果要有需要补充的,可以分享到评论区。


我是被编程耽误的文艺Tom,如果我的分享对你有帮助,请动动手指分享给更多的人。关注我,面试不再难!


我是被编程耽误的文艺Tom,关注我,面试不再难!


完整版面试资料和答案以及PDF文档 :

9106b97c16b34d06af118b23d081cde9.gif

相关文章
|
1天前
|
存储 安全 Java
Java一分钟之-Map接口与HashMap详解
【5月更文挑战第10天】Java集合框架中的`Map`接口用于存储唯一键值对,而`HashMap`是其快速实现,基于哈希表支持高效查找、添加和删除。本文介绍了`Map`的核心方法,如`put`、`get`和`remove`,以及`HashMap`的特性:快速访问、无序和非线程安全。讨论了键的唯一性、`equals()`和`hashCode()`的正确实现以及线程安全问题。通过示例展示了基本操作和自定义键的使用,强调理解这些概念对编写健壮代码的重要性。
4 0
|
1天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
8 0
|
1天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
6 0
|
1天前
|
Java
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
【JAVA进阶篇教学】第四篇:JDK8中函数式接口
|
2天前
|
Java
Java一分钟之-抽象类与接口的应用场景
【5月更文挑战第9天】Java中,抽象类和接口用于实现多态和抽象。抽象类不能实例化,提供部分实现和定义模板;接口包含无实现的抽象方法,用于定义行为规范和解耦合。选择时,关注行为用接口,部分实现用抽象类。注意抽象类的`final`和`static`方法、接口冲突等问题,明确设计目标,适度抽象,遵循接口设计原则,以提高代码质量。
11 1
|
2天前
|
Java
Java一分钟之-多态性:理解重写与接口
【5月更文挑战第9天】本文介绍了Java中的多态性,主要通过方法重写和接口实现。重写允许子类根据实际类型执行不同实现,关键点包括方法签名相同、访问权限不降低以及final、static和abstract方法不可重写。接口是抽象类型,包含抽象方法,提供另一种多态性实现。常见问题包括混淆重载与重写、不理解动态绑定以及滥用接口。为避免问题,需明确重写目的、合理设计接口,并在使用多态时注意类型检查。多态性是提升代码质量和灵活性的关键。
8 1
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
11 0
|
2天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
6 0
|
4天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
19 1
探索Java开发中触发空指针异常的场景
|
4天前
|
Java
三个可能的Java面试题
Java垃圾回收机制自动管理内存,回收无引用对象的内存,确保内存有效利用。多态性允许父类引用操作不同子类对象,如Animal引用可调用Dog的方法。异常处理机制通过try-catch块捕获和处理程序异常,例如尝试执行可能导致ArithmeticException的代码,catch块则负责处理异常。
25 9