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

相关文章
|
2天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
1天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
11 4
|
7天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
6天前
|
Java
Java基础(13)抽象类、接口
本文介绍了Java面向对象编程中的抽象类和接口两个核心概念。抽象类不能被实例化,通常用于定义子类的通用方法和属性;接口则是完全抽象的类,允许声明一组方法但不实现它们。文章通过代码示例详细解析了抽象类和接口的定义及实现,并讨论了它们的区别和使用场景。
|
6天前
|
Java 测试技术 API
Java零基础-接口详解
【10月更文挑战第19天】Java零基础教学篇,手把手实践教学!
15 1
|
11天前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
29 5
|
9天前
|
缓存 监控 Java
Java 线程池在高并发场景下有哪些优势和潜在问题?
Java 线程池在高并发场景下有哪些优势和潜在问题?
|
11天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
12 3
|
10天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
14 1
|
11天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
24 2