欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

如何防止被人刷验证码?

程序员文章站 2022-05-13 17:12:50
...
坑产品设计出来的注册/登录是可以获取手机验证码的,但是却没有加上图形验证码。然后现在我们的这个获取验证码的接口被人刷了好多下。最近一个小时足足有数千次请求,而且居然还是不同的IP和不同的手机号码....

求支招,除了加图形验证码外,怎么样防刷?

回复内容:

坑产品设计出来的注册/登录是可以获取手机验证码的,但是却没有加上图形验证码。然后现在我们的这个获取验证码的接口被人刷了好多下。最近一个小时足足有数千次请求,而且居然还是不同的IP和不同的手机号码....

求支招,除了加图形验证码外,怎么样防刷?

我能想到的,除了图形验证码:

  1. 基于手机号码,限制每天每个手机最多发N条验证码。这个貌似LZ已经加了。

  2. 基于IP,限制每天每个IP最多发N条验证码... -- 缺点:容易误杀正常用户,慎用

  3. 【究极手段】基于用户行为大数据分析

如何基于用户行为分析呢?想到一个简单的方法:

首先,正常用户除了发送验证码这个请求外,应该还会访问页面的其他资源,比如CSS/JS/HTML/图片等。

然而,如果是刷子,他可能并不会专门去访问这些个资源。

所以可以在用户访问页面的时候就记录一个human参数存在session中,每当其请求页面中的一个资源则human += 1。等到发送验证码的接口的时候,取出来这个human参数看看其值是多少,正常的一个用户这个human值应该是大于某个值的(比如5),小于的则应该就是刷子。(为0的肯定是刷子无疑)


我说的比较简单啦,更复杂点的可以顺便把几次请求之间的间隔记录下来,点击登录或注册按钮前鼠标的移动轨迹,鼠标按下收起的时间等等记录下来综合分析。

要是能引用或抄一个像google做的reCAPTCHA -- 点一下就自动识别人还是机器刷子 -- 就好了。

像新狼微波那样~ 只有用户名和密码存在,才发送验证马。


问题是通过手机验证码登录这个功能肯定不能再加密码。注册的密码可以随便填,意义不大呀

@locatejoe

不是显示密码之类的方式,而是把 用户名 和 密码 都取MD5值,拼接起来,再作哈希,映射到类似bloomFilter的过滤器中。
bloomFilter返回不存在则不发送验证马。
bloomFilter占空间不大,速度也很快。

之前已经遇到过这个问题

2天时间 2万多条信息刷完了

解决办法:

1.增加图形验证码
2.判断同一ip 同一手机 在一个时间段内只能发送3条信息 (虽然不友好 )
3.判断短信发送时间 如果30分钟内 还是同一个手机和ip 就不发送

反正有很多种方法 你试一下吧

如果是不同的ip和手机号,那么你就加上图形验证码把。。。

  • 增加图形验证码,字体颜色什么的别太单一。

  • 在一次短信发送完成之后需要有间隔时间,前端cookie判断,php那边单独进行存储

  • 接口需要判断请求的ip地址和手机号,距离上次时间间隔太短不允许发送