前言

前段时间在知识星球中,有位小伙伴问了我一个问题:用户注册接口如何防刷?

其实我之前有位同事,就经历过用户注册接口被刷的情况,导致产生了很多僵尸用户。

有些高手通过这些这些僵尸用户,产生登录信息,刷其他的接口,比如:用户签到接口,积分兑换接口,领取优惠券接口等。

他们通过这种方式能够获取一些利益,让真正的系统用户获取不到奖励。

因此,用户注册接口是非常重要的,如果该接口被刷,后续会产生很多隐患。

这篇文章跟大家一起聊聊,用户注册接口如何防刷,给有需要的小伙伴一个参考。

1 验证码校验

最早的用户注册接口,是需要用图形验证码校验的,比如下面这样的:image

用户只需要输入:账号名称、密码和验证码即可,完成注册。

其中账号名称作为用户的唯一标识。

但有些图形验证码比较简单,很容易被一些暴力破解工具破解。

由此,要给图形验证码增加难道,增加一些干扰项,增加暴力破解工具的难道。

但有个问题是:如果图形验证码太复杂了,会对正常用户使用造成一点的困扰,增加了用户注册的成本,让用户注册功能的效果会大打折扣。

因此,仅靠图形验证码,防止用户注册接口被刷,难道太大了。

后来,又出现了一种移动滑块形式的图形验证方式,安全性更高。image

2 邮箱校验

为了进一步增加用户注册接口被刷的风险,增加了邮箱验证功能。

在用户注册页面,可以输入邮箱号。

使用邮箱验证的好处是:

  1. 邮箱可以保证用户的唯一性,通过账号名保证唯一性有点不靠谱。
  2. 邮箱可以解决图形验证码被刷的问题。

邮箱校验有两种方式:

  1. 通过验证码校验
  2. 通过跳转连接校验

我们先看看通过验证码校验的方式。image这种方式跟短信有点类似,用户在输入邮箱后,点击某个按钮,先给你的指定邮箱发一封邮件,里面包含了一个验证码。

用户查询邮件之后,在注册页面输入正确的验证码,才能完成注册功能。

第二种方式是通过跳转链接校验:image用户在输入邮箱后,点击某个按钮,先给你的指定邮箱发一封邮件,但里面包含了一个跳转链接。

用户通过该跳转链接跳转到相应的页面,就可以完成注册。

如果邮箱通过这两种方式,确实可以避免用户注册接口被刷的问题。

但也会带来另外一个问题:用户注册流程变得更加繁琐,在用户注册时,需要登录一次邮箱才能完成。

如果刚好此时用户忘记了邮箱的密码,则无法注册。

由此,这邮箱的两种校验方式更多的用于用户密码修改的场景中。

但在大部分实际的用户注册的业务场景中,直接校验了邮箱的合法性,是否满足邮箱的正则表达式。

如果满足,再在数据库中校验该邮箱是否重复。如果不重复,才允许注册。

否则提升邮件不合法或者邮箱已存在。

3 短信校验

现在用户注册功能,主流的校验方式应该是短信校验了。image在用户注册页面,有个获取验证码按钮,用户输入手机号后,点击该按钮,短信服务器会想该手机号发送一条短信。image

用户获取到该条短信,然后在注册页面输入短信中的验证码,比如:881619,再点注册按钮才能注册成功。

现在大多数营业厅在办理新手机号时,需要进行身份证的实名认证,刷手机号是非常难的,成本非常高。

因此,现在绝大多数注册功能,都会要求用户输入手机号,不仅可以防止有人恶意刷注册接口。而且还可以有效的收集用户手机号,方便后面联系用户,或者发营销短信,或者祝福短信。

4 发短信接口如何防刷?

虽说短信校验可以有效防止用户刷注册接口,但如果发短信接口被刷了该怎么办?

通过chrome浏览器,用户是可以获取发短信接口的。image也可以看到请求参数。image如果有人直接通过jmeter压测工具多线程调用该接口,不停往该手机号发送短信。

可能会系统白白浪费很多短信。

我们知道发短信功能,是需要跟短信运营商购买的服务的。

一般情况下,1条短信1毛钱。

如果有人用工具一下子刷了你100万条短信,可能会让你破产。

这时该怎么办呢?

答:发短信接口要做防刷。

4.1 倒计时

我们如何做防刷功能呢?

image在注册页面上,用户点击发送短信按钮,会自动出现60秒钟的倒计时。

除非倒计时完成,否则用户无法从页面上点击该文案发送短信。

4.2 发送短信接口做限制

从页面上只能限制当前页面的不能重复发短信,但如果用户刷新了页面,也可以重新发短信。

因此非常有必要在服务端,即:发送短信接口做限制。

我们可以增加一张短信发送表。

该表包含:id、短信类型、短信内容、手机号、发送时间等字段。

image

有用户发送短信请求过来时:

  1. 先查询该手机号最近一次发送短信的记录
  2. 如果没有发送过,则发送短信。
  3. 如果该手机号已经发送过短信,但发送时间跟当前时间比超过了60秒,则重新发送一条新的短信。
  4. 如果发送时间跟当前时间比没超过60秒,则直接提示用户操作太频繁,请稍后重试。

这样就能非常有效的防止恶意用户刷短信的行为。

但还是有漏洞。

比如:用户知道在60秒以内,是没法重复发短信的。他有个程序,刚好每隔60秒发一条短信。

这样1个手机号在一天内可以发:60*24 = 1440 条短信。

如果他有100个手机号,那么一天也可以刷你很多条短信。

由此,还需要限制每天同一个手机号可以发的短信次数。

其实可以用redis来做。

用户发短信之后,在redis中保存一条记录,key是手机号,value是发短信的次数,过期时间是24小时。

这样在发送短信之前,要先查询一下,当天发送短信的次数是否超过10次(假设同一个手机号一天最多允许发10条短信)。

如果超过10次,则直接提示用户操作太频繁,请稍后重试。

如果没超过10次,则发送短信,并且把redis中该手机号对应的value值加1。

短信发送接口完整的校验流程如下:

image

最后修改:2026 年 06 月 05 日
如果觉得我的文章对你有用,请随意赞赏