资讯专栏INFORMATION COLUMN

工作记录 >> 登录短信验证码防刷解决思路

whataa / 2894人阅读

摘要:不过今天写的没有上面说的那么高大,只是一个小小的防刷解决思路。这是工作中经常遇到的在此仅做一个记录,以便回顾。同一个限制一分钟最多获取次超过次则锁定小时,锁定期间获取短信需加图片验证码收到这个需求利用做了简单的限流防刷功能。

一、写在前面

在互联网的发展史上,安全总是一个绕不开话题, 你有安全盾、我有破盾矛。所谓道高一尺、魔高一丈,不过互联网安全也正是在这种攻防中慢慢的发展起来的。

不过今天写的没有上面说的那么高大,只是一个小小的防刷解决思路。

这是工作中经常遇到的、在此仅做一个记录,以便回顾。

如有不严谨或者不完善的地方,欢迎指正 ~谢谢~

二、场景引入、问题凸显

场景: 在我们给 xx 做的区块链共享出行平台中区块链浏览器系统的登录是以用户的手机号+验证码来登录的。

因是内部用户使用、在登录这块也没做特殊的安全处理,导致在测试时被我们的测试小哥给刷爆了(在这给测试小哥点个赞)。

到这我们必然的收到一个bug了,业务期望。

1: 同一个ip限制一分钟最多获取5次

2: 超过5次则锁定1小时,锁定期间获取短信需加图片验证码

收到这个需求、利用Redis做了简单的限流防刷功能。

三、解决方案

首先分析需求,

1: 对同一IP做限制

2: 对单位时间内次数做限制

利用Redis来实现思路

1: 一个获取短信验证码请求过来我们首先的判断此IP是否已经被锁定(单位时间内超过了限定的访问次数)

2: 如果未被锁定则判断此IP是否是首次访问,如果是则给此IP加个生命周期以及记录访问次数。

3: 如果不是首次访问,则判断单位时间内是否符合限制要求。

完成这三不我们需要在 redis 中定义三个KEY

msg_lock_key_{ip} 记录次IP已被锁定

msg_time_key_{ip} 记录单位时间内IP

msg_counter_key_{ip} 记录单位时间内IP访问次数

到这就直接上一段代码吧,

public boolean checkMsgFrequency(String remotIp) {
        String romteIpString = remotIp.replace(".", "");

        // 1: 判断此ip是否已经被限制
        String msgLockKey = Constants.API_MSG_LOCK_KEY + romteIpString;
        if (jedis.exists(msgLockKey)) {
            // 此ip已经被锁住
            logger.info("此Ip[{}]以超过规定访问频率key:{}", remotIp, msgLockKey);
            return false;
        }

        // 2: 判断此ip是否在规定的时间内访问过
        String msgTimeKey = Constants.API_MSG_TIME_KEY + romteIpString;
        String msgCounterKey = Constants.API_MSG_COUNTER_KEY + romteIpString;
        // key 不存在
        if (!jedis.exists(msgTimeKey)) {
            // 加入缓存
            jedis.setEx(msgTimeKey, "0", imageCode.getLimitTime());
            jedis.setEx(msgCounterKey, "1", imageCode.getLimitTime());
        }

        if (jedis.exists(msgTimeKey) && (jedis.incrBy(msgCounterKey, 1) > imageCode.getLimitCounter())) {
            logger.info("此Ip[{}]以超过规定访问频率、进行枷锁key:{}", remotIp, msgTimeKey);
            jedis.setEx(msgLockKey, "0", imageCode.getLimitlockTime());
            return false;
        }
        return true;
    }

这是一个简单的代码实现, 逻辑就是这个逻辑,实现方式很多种。

你可以使用spring AOP + 自定义注解对逻辑进行分装。

也可以使用Redis + lua脚本对上述三步逻辑进行分装。

这个就看个人,重要的的理解实现的思路, 实现方式千万种总有一种是适合你的。

四、总结

对稀有资源的限流防刷,一般对单位时间的访问频率或者次数的限制。

我们主要是理解其解决问题的思路, 而不是记住实现代码。

主要思路:

1: 查看针对次请求(IP 或者 uid) 对当前请求资源是否已被锁定。

2: 如果没有被锁定,则给此请求加生命周期(也就是一个限制时间单位),同时记录访问次数。

3: 则判断此请求是否达到锁定条件

大致思想就是这三步。

此记录为加深自己记忆,同时以便温故,若能帮到你,万分高兴。

如有不对的地方欢迎留言指正 谢谢!

如您有更好的思路欢迎交流

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74705.html

相关文章

  • 无间盾反欺诈系统UIW正式上线

    摘要:产品简介无间盾是一款验证码产品,提供了拖动点选两种形式的验证码。计费周期服务点数具有年有效期,以最近次购买次数为准。【产品简介】无间盾是一款验证码产品,提供了拖动、点选两种形式的验证码。基于生物的行为特征,结合人工智能技术,在降低用户操作的难度的同时,有效防范羊毛党、垃圾注册、刷单、恶意评论、撞库等业务风险,保障业务的安全性,降低黑产团伙、自动化工具等欺诈行为带来的业务损失。【应用场景】1、...

    ernest.wang 评论0 收藏0
  • 当我们谈论验证码时,我们到底在谈论什么?

    摘要:在次失败后,第四次请求,就返回错误文案验证码连续错误三次,请重新获取短信验证码还有一个需要思考的维度。一般来说,短信验证码会有分钟的有效期。 前言: 现如今登录用手机验证码登录是越来越常见了。虽然会增加成本,不过对用户体验的提升还是很有帮助的。那么,当产品经理对开发说,来按照这个原型给我搞个短信验证码登录的时候。我们作为研发,应该想些什么?showImg(https://upload-...

    妤锋シ 评论0 收藏0
  • 大话后端开发的奇淫技巧大集合

    摘要:,大家好,很荣幸有这个机会可以通过写博文的方式,把这些年在后端开发过程中总结沉淀下来的经验和设计思路分享出来模块化设计根据业务场景,将业务抽离成独立模块,对外通过接口提供服务,减少系统复杂度和耦合度,实现可复用,易维护,易拓展项目中实践例子 Hi,大家好,很荣幸有这个机会可以通过写博文的方式,把这些年在后端开发过程中总结沉淀下来的经验和设计思路分享出来 模块化设计 根据业务场景,将业务...

    CloudwiseAPM 评论0 收藏0

发表评论

0条评论

whataa

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<