V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
ifconfig
V2EX  ›  程序员

网站被恶意调用发送验证码接口,已经要疯了!!!

  •  
  •   ifconfig · 2016-02-19 12:19:21 +08:00 · 19325 次点击
    这是一个创建于 3234 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前端有一个调用发送验证码的网页,估计被哪个别人有心的人恶意调用了,现在数据库不断在 insert 数据验证码的记录,有一个手机号多达 800 多次。目前已经限制每个手机号 5 分钟内只能发 5 条,但是对方换了策略,发了 N 多个手机号,天啊!求对策!

    第 1 条附言  ·  2016-02-19 13:56:22 +08:00

    场景是这样的:有一个注册页面,需要输入手机号,然后会有个获取验证码,验证码正确才能注册。
    恶意攻击的人找到了发送验证码这个地址,如: send_msg.php ,然后恶意调用了 N 次, CSRF 应该不是针对这个问题的。

    解决办法想到 2 种:

    1.加验证码
    2.IP 地址限定
    60 条回复    2016-11-30 15:04:00 +08:00
    yinxingren
        1
    yinxingren  
       2016-02-19 12:21:19 +08:00 via iPhone
    验证码~
    lshero
        2
    lshero  
       2016-02-19 12:21:29 +08:00
    加图验
    htfy96
        3
    htfy96  
       2016-02-19 12:22:31 +08:00
    限制每个 ip 5 分钟只能发 5 条, 30 分钟只能发 10 条, 2 小时内只能发 15 条?
    wclebb
        4
    wclebb  
       2016-02-19 12:23:38 +08:00
    这是用来「呼死你」短信,为达到让对方手机无法正常使用通信的目的。
    wclebb
        5
    wclebb  
       2016-02-19 12:24:25 +08:00
    你不说你网站是干嘛的。。。
    feiyuanqiu
        6
    feiyuanqiu  
       2016-02-19 12:26:00 +08:00
    把验证码放 redis 或缓存里?
    bjrjk
        7
    bjrjk  
       2016-02-19 12:28:44 +08:00 via Android
    你限制每个 IP 每分钟只能发 1 条,不管是那个手机号都只能一条不就完了
    daniellu
        8
    daniellu  
       2016-02-19 12:31:25 +08:00
    CSRF 验证?
    lijinma
        9
    lijinma  
       2016-02-19 12:35:31 +08:00
    我也遇到过,几个方法:

    1. 最通用的方法,就是在前端加 验证码来限制。
    2. 限制 ip ,使用 fail2ban 来监控 nginx 日志,然后限制 ip


    建议你使用方法 1 ,不要图简单。
    500miles
        10
    500miles  
       2016-02-19 12:36:44 +08:00
    验证码被识别了? 还是压根儿没有图形验证码?
    jarlyyn
        11
    jarlyyn  
       2016-02-19 12:43:53 +08:00
    加验证

    401 页面加 cookie,nginx 判断 cookie 反代,定时修改。

    动态 js 生成验证码,类似 crsf 。

    之前客户遇到过,我能想到的办法就这些。
    jarlyyn
        12
    jarlyyn  
       2016-02-19 12:44:39 +08:00
    另外不要考虑限制 ip 和手机号码。

    带不带重复的。

    我怀疑是坐在应用程序里的,而非网站。
    firefox12
        13
    firefox12  
       2016-02-19 12:44:46 +08:00
    图形校验码啊
    skiplow
        14
    skiplow  
       2016-02-19 12:47:19 +08:00
    接口加个校验值呀!
    br00k
        15
    br00k  
       2016-02-19 13:02:11 +08:00
    放数据库作死么。。。上 redis ,加点限制就行了。随便玩。
    meijing0114
        16
    meijing0114  
       2016-02-19 13:34:54 +08:00
    首先校验请求有效性吧,相同的验证码可以重复提交?
    其次对 ip 限频,防止被恶意调用。
    再次这种数据不适合放在数据库吧,如果只是要统计一下的话。
    shiny
        17
    shiny  
       2016-02-19 13:37:34 +08:00
    好多人好像没 get 到点,发短信验证码是要钱的。
    mailunion
        18
    mailunion  
       2016-02-19 13:41:40 +08:00
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    你把短信验证这一步取消了不就行了!
    phpcxy
        19
    phpcxy  
       2016-02-19 13:44:29 +08:00
    我用云片,他那边已经限制了 30 分钟同一个手机号只能发两条
    TangMonk
        20
    TangMonk  
       2016-02-19 13:45:01 +08:00
    我也遇到过,加了 csrf token 就没事了,如果还不行那就加入图形验证码
    homfen
        21
    homfen  
       2016-02-19 13:58:26 +08:00 via iPhone
    加个验证码呀,输入验证码才会发送短信,估计被利用做短信轰炸了
    RangerWolf
        22
    RangerWolf  
       2016-02-19 14:00:03 +08:00
    目前我感觉你能做的有两个事情:
    1. IP 限制
    2. 修改 php 的名字~ 然后调用的代码相应的也修改
    coosir
        23
    coosir  
       2016-02-19 14:01:25 +08:00
    我们遇到的是各种不同的 IP 和不同的手机号,防不胜防
    有效的办法就是加图形验证码
    istark
        24
    istark  
       2016-02-19 14:03:51 +08:00
    短信轰炸机用了你们短信验证码,以前我看到有人先邮箱验证,收到邮件在短信验证,再限制一些其他的,这个虽然繁琐了,效果会好点。
    realpg
        25
    realpg  
       2016-02-19 14:04:06 +08:00
    不带验证码就能发短信,你们这系统设计的人是 out of date 多久了……
    killerv
        26
    killerv  
       2016-02-19 15:11:50 +08:00
    加验证码是最合适的方法吧,个人觉得限制 ip 有可能会误杀。
    tonghuashuai
        27
    tonghuashuai  
       2016-02-19 15:15:23 +08:00
    图片验证码+频率验证策略基本可以解决这个问题
    zxgngl
        28
    zxgngl  
       2016-02-19 15:32:22 +08:00
    说句题外话,我觉得现在随便注册什么帐号就要验证并绑定手机号本身就是一个 bug 。
    skydiver
        29
    skydiver  
       2016-02-19 15:35:09 +08:00
    @zxgngl 这是一个 feature
    aprikyblue
        30
    aprikyblue  
       2016-02-19 15:42:38 +08:00
    先图形验证码过了才让发短信验证
    Raidal
        31
    Raidal  
       2016-02-19 15:49:04 +08:00
    先加图形验证码才允许发短信,这个策略很多短信服务商都有相关的安全提醒
    Light3
        32
    Light3  
       2016-02-19 15:51:49 +08:00
    - - 你的短信商 没有 一个小时就让发 3 个的限制吗
    Srar
        33
    Srar  
       2016-02-19 17:36:08 +08:00
    geetest
    pyshift
        34
    pyshift  
       2016-02-19 17:40:56 +08:00
    我很好奇,运营商居然没有屏蔽你。不知道用得哪家的服务,一般都会直接屏蔽拉黑你才对啊。图验和 IP 监控其实只是增加难度而已,图验一般立竿见影, IP 地址搞个代理你就傻眼了。
    wd0g
        35
    wd0g  
       2016-02-19 19:36:34 +08:00
    一般每个手机号,每天设置 3 次验证码就 OK 了
    cmxz
        36
    cmxz  
       2016-02-19 19:40:24 +08:00
    图片验证码
    sding
        37
    sding  
       2016-02-19 19:44:49 +08:00 via Android
    设计系统时没考虑到这种情况???加图验
    KevinChan
        38
    KevinChan  
       2016-02-19 19:46:30 +08:00 via iPhone
    那就用邮箱注册呗,手机验证码注册的除非必须,否则就不注册
    flyingnn
        39
    flyingnn  
       2016-02-19 20:01:08 +08:00 via Android
    京东,百度的注册是没有图片验证码的,是钱嗯,还是防御技术?
    lutla
        40
    lutla  
       2016-02-19 20:03:11 +08:00
    一看就是被 0gtx 那批人给利用了 233
    salmon5
        41
    salmon5  
       2016-02-19 20:22:28 +08:00
    加验证码,
    手机注册就手机注册呗,有些程序猿真是清高,有些场景就是需要手机验证码这种相对物理的安全验证方式。你破解我手机验证码试试?邮箱撞库安全系数没手机高。
    nightv2
        42
    nightv2  
       2016-02-19 22:23:37 +08:00 via Android
    同样好奇短信提供商没有屏蔽你么?
    jyu213
        43
    jyu213  
       2016-02-19 22:24:14 +08:00
    好好奇,为啥没有人提 360 的双向验证。。。
    tianice
        44
    tianice  
       2016-02-19 22:25:51 +08:00
    后台加上验证规则,像你之前的规则,超过规则后后台不发送验证码,前台还是提示发送成功,他摸不透你的规则就老实了,前台无论如何都要提示发送成功
    libook
        45
    libook  
       2016-02-19 22:33:54 +08:00
    1 阶段:验证码
    2 阶段:记录放在 Redis 缓存里
    3 阶段:缓存用 IP 做 Key
    4 阶段:反思一下自己得罪谁了

    通常 1 阶段就够了。
    gkiwi
        46
    gkiwi  
       2016-02-19 23:05:06 +08:00
    难道只有我考虑的是,要浪费我好多钱么。。。
    publicAdmin
        47
    publicAdmin  
       2016-02-19 23:07:21 +08:00
    建议:
    1.如果有安全厂商的联系渠道,建议通过其获取一份手机号码黑名单过滤文件
    (至于他们的数据来源,未知。猜测是通过某些策略判断为机器人操作后添加的)
    2.如果需要保持足够高的安全性,且用户普遍质量偏高,建议尝试语音验证码
    3.server 添加短信策略
    4.安利个传说的新型验证方式.`极验`
    弊端:
    会误杀部分,但对刷验证码应该有一定缓解。短信商没封你的接口也算是可以了。
    pabno
        48
    pabno  
       2016-02-19 23:16:44 +08:00
    图片验证应该就够了,如果做 IP 限制,挺多地方是一片区域共用一个 IP 的,例如广州这边的城中村。
    @zxgngl 估计是想要收集数据吧
    leilux
        49
    leilux  
       2016-02-19 23:19:21 +08:00
    如果是直接调用 send_msg.php 的加 csrf 可以解决
    如果是靠刷注册页面来发短信的可以加图形验证码

    总之 send_msg.php 这个需要有个类似 token 的参数来增加调用的代价
    tairan2006
        50
    tairan2006  
       2016-02-20 00:14:38 +08:00 via iPad
    加图形验证码,语音验证码,或者干脆让用户给你发短信。。
    体验依次下降
    bkmi
        51
    bkmi  
       2016-02-20 00:16:08 +08:00
    超过几次之后 图像验证码啊 这种强度,就算不是刷验证码 普通页面都应该封 ip 了吧
    incompatible
        52
    incompatible  
       2016-02-20 00:22:11 +08:00
    @br00k 楼主的问题并不在于用数据库还是 redis 。以及这点数据量用数据库怎么就作死了?
    pynix
        53
    pynix  
       2016-02-20 00:52:18 +08:00
    笑尿
    MrMario
        54
    MrMario  
       2016-02-20 08:46:56 +08:00
    可以试试阿里的滑动验证,就用户体验来说,还是可以的
    wbsdty331
        55
    wbsdty331  
       2016-02-20 11:32:29 +08:00
    让用户给你发短信 怎么样
    xlrtx
        56
    xlrtx  
       2016-02-20 11:32:37 +08:00
    sms 服务应该会有每天上限的, 我做过的一个是每天同一个手机 5 条, 再加上 captcha 和 ip 限制, 就不会有问题的
    tSQghkfhTtQt9mtd
        57
    tSQghkfhTtQt9mtd  
       2016-02-20 13:19:47 +08:00


    当然你用户如果不是都会翻墙那当我没说
    mrwangrj
        58
    mrwangrj  
       2016-02-20 15:10:50 +08:00
    h4rdy
        59
    h4rdy  
       2016-02-20 16:19:54 +08:00
    给 send_msg.php 传输 post 数据。
    number=1388888888&token=xxxxxx
    使用 token
    jlj224
        60
    jlj224  
       2016-11-30 15:04:00 +08:00
    我们用的 SUBMAIL 是有每日次数限制的。而且他们有个主动防御机制,但是有部分会被误杀 http://submail.cn/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5295 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 108ms · UTC 07:50 · PVG 15:50 · LAX 23:50 · JFK 02:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.