用户注册接口如何防刷?
前言
最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你)。
前段时间在知识星球中,有位小伙伴问了我一个问题:用户注册接口如何防刷?
其实我之前有位同事,就经历过用户注册接口被刷的情况,导致产生了很多僵尸用户。
有些高手通过这些这些僵尸用户,产生登录信息,刷其他的接口,比如:用户签到接口,积分兑换接口,领取优惠券接口等。
他们通过这种方式能够获取一些利益,让真正的系统用户获取不到奖励。
因此,用户注册接口是非常重要的,如果该接口被刷,后续会产生很多隐患。
这篇文章跟大家一起聊聊,用户注册接口如何防刷,给有需要的小伙伴一个参考。
1 验证码校验
最早的用户注册接口,是需要用图形验证码校验的,比如下面这样的:
用户只需要输入:账号名称、密码和验证码即可,完成注册。
其中账号名称作为用户的唯一标识。
但有些图形验证码比较简单,很容易被一些暴力破解工具破解。
由此,要给图形验证码增加难道,增加一些干扰项,增加暴力破解工具的难道。
但有个问题是:如果图形验证码太复杂了,会对正常用户使用造成一点的困扰,增加了用户注册的成本,让用户注册功能的效果会大打折扣。
因此,仅靠图形验证码,防止用户注册接口被刷,难道太大了。
后来,又出现了一种移动滑块形式的图形验证方式,安全性更高。 
2 邮箱校验
为了进一步增加用户注册接口被刷的风险,增加了邮箱验证功能。
在用户注册页面,可以输入邮箱号。
使用邮箱验证的好处是:
- 邮箱可以保证用户的唯一性,通过账号名保证唯一性有点不靠谱。
- 邮箱可以解决图形验证码被刷的问题。
邮箱校验有两种方式:
- 通过验证码校验
- 通过跳转连接校验
我们先看看通过验证码校验的方式。
这种方式跟短信有点类似,用户在输入邮箱后,点击某个按钮,先给你的指定邮箱发一封邮件,里面包含了一个验证码。
用户查询邮件之后,在注册页面输入正确的验证码,才能完成注册功能。
第二种方式是通过跳转链接校验:
用户在输入邮箱后,点击某个按钮,先给你的指定邮箱发一封邮件,但里面包含了一个跳转链接。
用户通过该跳转链接跳转到相应的页面,就可以完成注册。
如果邮箱通过这两种方式,确实可以避免用户注册接口被刷的问题。
但也会带来另外一个问题:用户注册流程变得更加繁琐,在用户注册时,需要登录一次邮箱才能完成。
如果刚好此时用户忘记了邮箱的密码,则无法注册。
由此,这邮箱的两种校验方式更多的用于用户密码修改的场景中。
但在大部分实际的用户注册的业务场景中,直接校验了邮箱的合法性,是否满足邮箱的正则表达式。
如果满足,再在数据库中校验该邮箱是否重复。如果不重复,才允许注册。
否则提升邮件不合法或者邮箱已存在。
3 短信校验
现在用户注册功能,主流的校验方式应该是短信校验了。
在用户注册页面,有个获取验证码按钮,用户输入手机号后,点击该按钮,短信服务器会想该手机号发送一条短信。
用户获取到该条短信,然后在注册页面输入短信中的验证码,比如:881619,再点注册按钮才能注册成功。
现在大多数营业厅在办理新手机号时,需要进行身份证的实名认证,刷手机号是非常难的,成本非常高。
最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你)。
因此,现在绝大多数注册功能,都会要求用户输入手机号,不仅可以防止有人恶意刷注册接口。而且还可以有效的收集用户手机号,方便后面联系用户,或者发营销短信,或者祝福短信。
4 发短信接口如何防刷?
虽说短信校验可以有效防止用户刷注册接口,但如果发短信接口被刷了该怎么办?
通过chrome浏览器,用户是可以获取发短信接口的。
也可以看到请求参数。
如果有人直接通过jmeter压测工具多线程调用该接口,不停往该手机号发送短信。
可能会系统白白浪费很多短信。
我们知道发短信功能,是需要跟短信运营商购买的服务的。
一般情况下,1条短信1毛钱。
如果有人用工具一下子刷了你100万条短信,可能会让你破产。
这时该怎么办呢?
答:发短信接口要做防刷。
4.1 倒计时
我们如何做防刷功能呢?
在注册页面上,用户点击发送短信按钮,会自动出现60秒钟的倒计时。
除非倒计时完成,否则用户无法从页面上点击该文案发送短信。
4.2 发送短信接口做限制
从页面上只能限制当前页面的不能重复发短信,但如果用户刷新了页面,也可以重新发短信。
因此非常有必要在服务端,即:发送短信接口做限制。
我们可以增加一张短信发送表。
该表包含:id、短信类型、短信内容、手机号、发送时间等字段。

有用户发送短信请求过来时:
- 先查询该手机号最近一次发送短信的记录
- 如果没有发送过,则发送短信。
- 如果该手机号已经发送过短信,但发送时间跟当前时间比超过了60秒,则重新发送一条新的短信。
- 如果发送时间跟当前时间比没超过60秒,则直接提示用户操作太频繁,请稍后重试。
这样就能非常有效的防止恶意用户刷短信的行为。
但还是有漏洞。
比如:用户知道在60秒以内,是没法重复发短信的。他有个程序,刚好每隔60秒发一条短信。
这样1个手机号在一天内可以发:60*24 = 1440 条短信。
如果他有100个手机号,那么一天也可以刷你很多条短信。
由此,还需要限制每天同一个手机号可以发的短信次数。
其实可以用redis来做。
用户发短信之后,在redis中保存一条记录,key是手机号,value是发短信的次数,过期时间是24小时。
这样在发送短信之前,要先查询一下,当天发送短信的次数是否超过10次(假设同一个手机号一天最多允许发10条短信)。
如果超过10次,则直接提示用户操作太频繁,请稍后重试。
如果没超过10次,则发送短信,并且把redis中该手机号对应的value值加1。
短信发送接口完整的校验流程如下: 
最近缺项目经历想快速提升项目实战能力(包含多个AI项目),或者最近找工作,或者想学习AI的小伙伴,可以看看下面👇🏻的这个链接(或许真的能够帮到你)。