手机验证码如何实现-JS

代码诗人
• 阅读 1871

前言

现在基本上各种手机APP注册都会用到手机验证码,包括一些PC端网站也会使用手机号作为唯一标识验证!

恰巧,小明的老板,让其开发一个用户注册的功能,并且强制用户注册绑定手机,美其名曰为了提升安全性,呵呵哒,就是为了多撸一点用户信息。

案例

一般来说,发送手机验证码不能过于频繁,前端发送按钮点击后一般会有一个60秒倒计时的功能。也就是说,如果用户点击发送一直没有收到验证码,只能60秒之后才可以进行重发。

那么问题来了,如果用户绕过前端,直接向后台API发送短信请求,然后写个无限循环脚本,相信不久你的短信账户就会发来预警提示短信(一般来说大的短信商都有预警设置功能)。

其实很简单,你只需要F12,查看发送请求就可以查找出后台请求地址,然后你可以在控制台输入相关JS代码,执行个十万遍,是不是很爽?

这里以七牛云为测试案例,打开注册页面,F12进入调试模式,输入手机号,手动点击发送,获取其短信发送后台请求地址。下面是七牛云的一个短信发送请求,撸主测试了一下,显然没有达到撸主的预期,毕竟是大厂,防御措施还是做的很牛逼的。

以下是JS脚本,复制粘贴到控制台回车就可以执行:

var data = {"operation":1,"is_voice":false,"mobile_number":"17762018888","captcha_type":2};
for (var i = 0; i < 10; i++) {
    $.ajax({
        type: 'POST',
        contentType: 'application/json;charset=UTF-8',
        data:JSON.stringify(data),
        url: 'https://portal.qiniu.com/api/gaea/verification/sms/send',
        success: function(data) {
            console.log(data)
        }
    });
}

控制台返回以下信息,前三次请求成功,后面的就出现了验证码校验并进行了限流操作。

{"code":200,"message":""}
{"code":200,"message":""}
{"code":200,"message":""}
{"code": 7209,"message":"captcha required"}
{"code": 7209,"message":"captcha required"}
{"code": 429,"message":"too many requests"}
{"code": 429,"message":"too many requests"}
{"code": 429,"message":"too many requests"}
{"code": 429,"message":"too many requests"}
{"code": 7209,"message":"captcha required"}

撸主尝试刷新页面,随便输了一个手机号,再次点击发送,提示用户输入验证码,显然是加强了防备,触发了恶意请求认证拦截机制。

安全机制

对于开发者来说,他们不仅要考虑用户正常获取验证码的体验还要考虑短信接口的安全性,撸主总结了以下几点,希望对大家有所帮助。

  • 后台请求限流,对单位时间内发送频率做限制。
  • 验证码机制,切记不要一开始就限制验证码,体验及其不友好,触发限流以后开启验证码校验。
  • 监控日发送短信数量,触发一定的阈值做相应的处理,根据实际业务需求。
  • 验证码存储一定要保证key为手机号,切记不要以其它标识作为key,比如sessionId
  • 一定要设置验证码失效时间,比如五分钟,或者更短。
  • 验证码尽量保证短小精悍,四到六位即可。
  • 如果后台不做限制,切记前台一定要做个倒计时的限制,至少过滤一部分小白用户。

代码案例

给小伙伴分享一个简单的验证码生成、存储、失效代码案例:

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class Mobile {
    /**
     * 测试方便,这里设置了3秒失效
     */
    private static LoadingCache<String, String> caches = CacheBuilder.newBuilder()
            .maximumSize(1000)
            .expireAfterWrite(3, TimeUnit.SECONDS)
            .build(new CacheLoader<String, String>() {
                @Override
                public String load(String mobile) {
                    return "";
                }
            });

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Integer code = (int)((Math.random()*9+1)*100000);
        caches.put("17762018888",code.toString());
        System.out.println(caches.get("17762018888"));
        Thread.sleep(4000);
        System.out.println("是不是没了:"+caches.get("17762018888"));
    }
}

小结

重要的功能必须进行前后端校验,必要的时候一定要做好限流、黑名单等骚操作!!!

点赞
收藏
评论区
推荐文章
不是海碗 不是海碗
2年前
轻松解决国内无法【注册ChatGPT】,快速【体验ChatGPT】
最近ChatGPT真的是无敌爆火,但是国内用户是无法使用国内手机号注册,需要使用国外的手机号注册,那更别说想去体验一下ChatGPT了。这就导致【注册ChatGPT】成为了广大国内开发者头疼的事情。
宙哈哈 宙哈哈
2年前
PHP短信验证码防刷方案
短信验证码是通过发送验证码到手机的一种有效的验证码系统。利用短信验证码来注册会员,大大降低了非法注册的数据。
liam liam
2年前
如何读取redis的手机号验证码数据,实现自动化登录测试
1、案例描述用户选择短信登录!发送短信后,后端接口逻辑已把验证码缓存在redis,!在apifox上定义对应下发登录短信接口,短信登录接口下载地址:这时候问题就来了,怎么样才能让apifox自动获取下发登录短信接口对应的手机号的验证码,自动填充到短信登录接口的code字段?2、解决思路方案一:后端通过接口返回验证码
Stella981 Stella981
3年前
Shiro要点概览与SpringBoot整合实例
1\.简介概念说明Subject主体,简化点说就是用户实体PrincipalSubject的唯一标识,如id、用户名、手机号、邮箱等Credential凭证信息,主体证明自己的东西,如密码、证书等Authenticator认证器,对Subject身份进行认证,例如验证用户的用户名和密码是否匹配Aut
Stella981 Stella981
3年前
DBShop功能简介
DBShop功能简介商城模块功能功能描述系统设置基本设置1、网站名称、关键字、描述等seo设置2、网站logo、备案号设置3、系统关闭、系统开启、系统时区设置(针对不同国家时区)验证码1、注册验证码2、登录验证码3、商品咨询验证码4、手机验证码消息通知
2022年推荐免费在线接收短信平台(国内、国外)
现代社会中大多数人容易忘记密码,因此,为了方便,各大网站或者APP就相继出现以手机号码进行短信验证来注册和登录等操作。但此时,大多个人手机号码都已经是实名认证的,就非常怕存在个人信息泄露的情况。近几年网络平台用户数据泄露事件层出不穷,勿论一般平台,甚至一些全球知名企业也曾被曝出用户数据泄露问题,那基于此我们用户又能做点什么呢?出于这个原因,我们使用可以在一段
曼成 曼成
1年前
如何将手机号码归属地API接入到自己的程序当中?
在现代应用程序中,获取手机号码的归属地信息是一个常见的需求。这可以用于验证用户的手机号码,了解用户所在地区,以及提供个性化的服务。为了实现这一目标,你可以通过API接入第三方服务,以获取手机号码的归属地信息。
曼成 曼成
1年前
手机号码实时检测API:提高信息成功送达给用户的利器
在数字化通信时代,手机号码成为了连接用户与服务的重要桥梁。然而,随着用户更换号码的频率增加,以及号码的停用和重新分配,确保发送的信息能够准确无误地到达目标用户手中,成为了一个挑战。手机号码实时检测API应运而生,它通过实时验证手机号码的有效性,帮助企业和开发者提高信息的送达率和用户满意度。
E小媛同学 E小媛同学
1年前
如何快速实现手机号码实时检测的功能
在现代的网络服务中,手机号码实时检测功能是一项重要的安全措施,它能够帮助验证用户身份,防止欺诈行为,并且提供用户行为分析的数据支持。本文将详细介绍如何通过编写UI代码和接入API来实现手机号码实时检测功能。
曼成 曼成
1年前
手机号码归属地API接入 demo 示例
在现代的互联网应用开发中,手机号码归属地查询是一个非常实用的功能,它可以帮助开发者为用户提供更加个性化的服务。例如,电商网站可以根据用户手机号的归属地推荐本地商品,旅游类应用可以根据用户所在地提供相应的旅游信息等。本文将介绍如何通过API接口实现手机号码归属地的查询功能,并提供一个简单的demo示例。
曼成 曼成
1年前
验证码短信API接入 Demo 示例
验证码短信API是一种广泛应用于各类应用中的安全验证服务,它通过发送短信验证码到用户手机,以确保操作的安全性和真实性。本文将为您提供一个简单的验证码短信API接入的示例,帮助您快速理解和实现该功能。