前端有一个调用发送验证码的网页,估计被哪个别人有心的人恶意调用了,现在数据库不断在 insert 数据验证码的记录,有一个手机号多达 800 多次。目前已经限制每个手机号 5 分钟内只能发 5 条,但是对方换了策略,发了 N 多个手机号,天啊!求对策!
场景是这样的:有一个注册页面,需要输入手机号,然后会有个获取验证码,验证码正确才能注册。
恶意攻击的人找到了发送验证码这个地址,如: send_msg.php ,然后恶意调用了 N 次, CSRF 应该不是针对这个问题的。
解决办法想到 2 种:
![]() | 1 yinxingren 2016-02-19 12:21:19 +08:00 via iPhone 验证码~ |
![]() | 2 lshero 2016-02-19 12:21:29 +08:00 加图验 |
![]() | 3 htfy96 2016-02-19 12:22:31 +08:00 限制每个 ip 5 分钟只能发 5 条, 30 分钟只能发 10 条, 2 小时内只能发 15 条? |
![]() | 4 wclebb 2016-02-19 12:23:38 +08:00 这是用来「呼死你」短信,为达到让对方手机无法正常使用通信的目的。 |
![]() | 5 wclebb 2016-02-19 12:24:25 +08:00 你不说你网站是干嘛的。。。 |
6 feiyuanqiu 2016-02-19 12:26:00 +08:00 把验证码放 redis 或缓存里? |
7 bjrjk 2016-02-19 12:28:44 +08:00 via Android 你限制每个 IP 每分钟只能发 1 条,不管是那个手机号都只能一条不就完了 |
8 daniellu 2016-02-19 12:31:25 +08:00 CSRF 验证? |
9 lijinma 2016-02-19 12:35:31 +08:00 我也遇到过,几个方法: 1. 最通用的方法,就是在前端加 验证码来限制。 2. 限制 ip ,使用 fail2ban 来监控 nginx 日志,然后限制 ip 建议你使用方法 1 ,不要图简单。 |
![]() | 10 500miles 2016-02-19 12:36:44 +08:00 验证码被识别了? 还是压根儿没有图形验证码? |
![]() | 11 jarlyyn 2016-02-19 12:43:53 +08:00 加验证 401 页面加 cookie,nginx 判断 cookie 反代,定时修改。 动态 js 生成验证码,类似 crsf 。 之前客户遇到过,我能想到的办法就这些。 |
![]() | 12 jarlyyn 2016-02-19 12:44:39 +08:00 另外不要考虑限制 ip 和手机号码。 带不带重复的。 我怀疑是坐在应用程序里的,而非网站。 |
13 firefox12 2016-02-19 12:44:46 +08:00 图形校验码啊 |
![]() | 14 skiplow 2016-02-19 12:47:19 +08:00 接口加个校验值呀! |
![]() | 15 br00k 2016-02-19 13:02:11 +08:00 放数据库作死么。。。上 redis ,加点限制就行了。随便玩。 |
16 meijing0114 2016-02-19 13:34:54 +08:00 首先校验请求有效性吧,相同的验证码可以重复提交? 其次对 ip 限频,防止被恶意调用。 再次这种数据不适合放在数据库吧,如果只是要统计一下的话。 |
![]() | 17 shiny 2016-02-19 13:37:34 +08:00 好多人好像没 get 到点,发短信验证码是要钱的。 |
18 mailunion 2016-02-19 13:41:40 +08:00 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! 你把短信验证这一步取消了不就行了! |
![]() | 19 phpcxy 2016-02-19 13:44:29 +08:00 我用云片,他那边已经限制了 30 分钟同一个手机号只能发两条 |
![]() | 20 TangMonk 2016-02-19 13:45:01 +08:00 我也遇到过,加了 csrf token 就没事了,如果还不行那就加入图形验证码 |
![]() | 21 homfen 2016-02-19 13:58:26 +08:00 via iPhone 加个验证码呀,输入验证码才会发送短信,估计被利用做短信轰炸了 |
![]() | 22 RangerWolf 2016-02-19 14:00:03 +08:00 目前我感觉你能做的有两个事情: 1. IP 限制 2. 修改 php 的名字~ 然后调用的代码相应的也修改 |
![]() | 23 coosir 2016-02-19 14:01:25 +08:00 我们遇到的是各种不同的 IP 和不同的手机号,防不胜防 有效的办法就是加图形验证码 |
24 istark 2016-02-19 14:03:51 +08:00 短信轰炸机用了你们短信验证码,以前我看到有人先邮箱验证,收到邮件在短信验证,再限制一些其他的,这个虽然繁琐了,效果会好点。 |
![]() | 25 realpg PRO 不带验证码就能发短信,你们这系统设计的人是 out of date 多久了…… |
26 killerv 2016-02-19 15:11:50 +08:00 加验证码是最合适的方法吧,个人觉得限制 ip 有可能会误杀。 |
![]() | 27 tonghuashuai 2016-02-19 15:15:23 +08:00 图片验证码+频率验证策略基本可以解决这个问题 |
![]() | 28 zxgngl 2016-02-19 15:32:22 +08:00 说句题外话,我觉得现在随便注册什么帐号就要验证并绑定手机号本身就是一个 bug 。 |
30 aprikyblue 2016-02-19 15:42:38 +08:00 先图形验证码过了才让发短信验证 |
![]() | 31 Raidal 2016-02-19 15:49:04 +08:00 先加图形验证码才允许发短信,这个策略很多短信服务商都有相关的安全提醒 |
![]() | 32 Light3 2016-02-19 15:51:49 +08:00 - - 你的短信商 没有 一个小时就让发 3 个的限制吗 |
![]() | 33 Srar 2016-02-19 17:36:08 +08:00 geetest |
![]() | 34 pyshift 2016-02-19 17:40:56 +08:00 我很好奇,运营商居然没有屏蔽你。不知道用得哪家的服务,一般都会直接屏蔽拉黑你才对啊。图验和 IP 监控其实只是增加难度而已,图验一般立竿见影, IP 地址搞个代理你就傻眼了。 |
35 wd0g 2016-02-19 19:36:34 +08:00 一般每个手机号,每天设置 3 次验证码就 OK 了 |
36 cmxz 2016-02-19 19:40:24 +08:00 图片验证码 |
37 sding 2016-02-19 19:44:49 +08:00 via Android 设计系统时没考虑到这种情况???加图验 |
![]() | 38 KevinChan 2016-02-19 19:46:30 +08:00 via iPhone 那就用邮箱注册呗,手机验证码注册的除非必须,否则就不注册 |
![]() | 39 flyingnn 2016-02-19 20:01:08 +08:00 via Android 京东,百度的注册是没有图片验证码的,是钱嗯,还是防御技术? |
![]() | 40 lutla 2016-02-19 20:03:11 +08:00 一看就是被 0gtx 那批人给利用了 233 |
41 salmon5 2016-02-19 20:22:28 +08:00 加验证码, 手机注册就手机注册呗,有些程序猿真是清高,有些场景就是需要手机验证码这种相对物理的安全验证方式。你破解我手机验证码试试?邮箱撞库安全系数没手机高。 |
42 nightv2 2016-02-19 22:23:37 +08:00 via Android 同样好奇短信提供商没有屏蔽你么? |
![]() | 43 jyu213 2016-02-19 22:24:14 +08:00 好好奇,为啥没有人提 360 的双向验证。。。 |
44 tianice 2016-02-19 22:25:51 +08:00 后台加上验证规则,像你之前的规则,超过规则后后台不发送验证码,前台还是提示发送成功,他摸不透你的规则就老实了,前台无论如何都要提示发送成功 |
![]() | 45 libook 2016-02-19 22:33:54 +08:00 1 阶段:验证码 2 阶段:记录放在 Redis 缓存里 3 阶段:缓存用 IP 做 Key 4 阶段:反思一下自己得罪谁了 通常 1 阶段就够了。 |
![]() | 46 gkiwi 2016-02-19 23:05:06 +08:00 难道只有我考虑的是,要浪费我好多钱么。。。 |
![]() | 47 publicAdmin 2016-02-19 23:07:21 +08:00 建议: 1.如果有安全厂商的联系渠道,建议通过其获取一份手机号码黑名单过滤文件 (至于他们的数据来源,未知。猜测是通过某些策略判断为机器人操作后添加的) 2.如果需要保持足够高的安全性,且用户普遍质量偏高,建议尝试语音验证码 3.server 添加短信策略 4.安利个传说的新型验证方式.`极验` 弊端: 会误杀部分,但对刷验证码应该有一定缓解。短信商没封你的接口也算是可以了。 |
48 pabno 2016-02-19 23:16:44 +08:00 图片验证应该就够了,如果做 IP 限制,挺多地方是一片区域共用一个 IP 的,例如广州这边的城中村。 @zxgngl 估计是想要收集数据吧 |
![]() | 49 leilux 2016-02-19 23:19:21 +08:00 如果是直接调用 send_msg.php 的加 csrf 可以解决 如果是靠刷注册页面来发短信的可以加图形验证码 总之 send_msg.php 这个需要有个类似 token 的参数来增加调用的代价 |
50 tairan2006 2016-02-20 00:14:38 +08:00 via iPad 加图形验证码,语音验证码,或者干脆让用户给你发短信。。 体验依次下降 |
![]() | 51 bkmi 2016-02-20 00:16:08 +08:00 超过几次之后 图像验证码啊 这种强度,就算不是刷验证码 普通页面都应该封 ip 了吧 |
![]() | 52 incompatible 2016-02-20 00:22:11 +08:00 @br00k 楼主的问题并不在于用数据库还是 redis 。以及这点数据量用数据库怎么就作死了? |
![]() | 53 pynix 2016-02-20 00:52:18 +08:00 笑尿 |
![]() | 54 MrMario 2016-02-20 08:46:56 +08:00 可以试试阿里的滑动验证,就用户体验来说,还是可以的 |
![]() | 55 wbsdty331 2016-02-20 11:32:29 +08:00 让用户给你发短信 怎么样 |
56 xlrtx 2016-02-20 11:32:37 +08:00 sms 服务应该会有每天上限的, 我做过的一个是每天同一个手机 5 条, 再加上 captcha 和 ip 限制, 就不会有问题的 |
![]() | 57 tSQghkfhTtQt9mtd 2016-02-20 13:19:47 +08:00 ![]() 当然你用户如果不是都会翻墙那当我没说 |
![]() | 58 mrwangrj 2016-02-20 15:10:50 +08:00 |
![]() | 59 h4rdy 2016-02-20 16:19:54 +08:00 给 send_msg.php 传输 post 数据。 number=1388888888&token=xxxxxx 使用 token |
60 jlj224 2016-11-30 15:04:00 +08:00 我们用的 SUBMAIL 是有每日次数限制的。而且他们有个主动防御机制,但是有部分会被误杀 http://submail.cn/ |