V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaoyong
V2EX  ›  程序员

后端开发大湿们,短信发送防止接口被恶意调用的方案有没有好的建议(除了传统的图形验证码以外)

  •  
  •   xiaoyong · 2020-06-05 13:12:29 +08:00 · 5819 次点击
    这是一个创建于 1414 天前的主题,其中的信息可能已经有所发展或是发生改变。

    传统的图形验证码就不说了,还有没有其他的思路。

    尤其是用户注册那一块,毕竟还没有任何登录用户的信息。

    也不能太复杂,同时也需要兼顾开发成本和使用成本;不能为了安全,牺牲好用性。

    43 条回复    2020-06-07 03:15:31 +08:00
    yujiang
        1
    yujiang  
       2020-06-05 13:18:46 +08:00 via Android
    让用户往指定的号码发指定的短信
    kucy
        2
    kucy  
       2020-06-05 13:22:29 +08:00
    传参 rsa 加密
    dangyuluo
        3
    dangyuluo  
       2020-06-05 13:23:48 +08:00
    参考下各大厂商典型的仿恶意注册服务?例如防水墙
    skypyb
        4
    skypyb  
       2020-06-05 13:26:30 +08:00 via Android
    ip/手机号限流,验证方式升级(滑块、转图片之类的)
    chendy
        5
    chendy  
       2020-06-05 13:26:33 +08:00
    传统的图形验证码不行…那就滑动验证码?…
    sidegem
        6
    sidegem  
       2020-06-05 13:28:46 +08:00
    短线服务厂商可以限制每个手机号发送的短信的频率吧
    zzzmh
        7
    zzzmh  
       2020-06-05 13:36:46 +08:00
    前端用 node webpack 打包,接口的请求头设置一个规则,例如时间戳+方法名+参数+域名算 MD5 截中间 8 位,后端校验请求头。
    后端用 springboot 拦截器+redis 计数器,同 ip,每小时 10 次,同手机号每分钟 1 次。

    再不行就没招了,加滑图形动验证码什么的。
    kkeiko
        8
    kkeiko  
       2020-06-05 13:44:21 +08:00   ❤️ 5
    你的目的是防刷接口,那前置的校验是没用的。
    1. 接口要有签名,如果是 app,秘钥放在 app 里已经能挡住一大片人了,除非你这个东西有利可图,不然能破解 app 的高级攻击者没必要搞你。
    2. 多维度频次限制,手机号、ip 、app 指纹、浏览器指纹等。
    3. 复杂的图形验证码、滑块等组件,当前手机号触发的验证码通过后端校验通过才发短信。
    4. 先要求绑定其他第三方账号体系,成功后才能注册你们的,等于是让已有完备用户信息的账号来帮你拦一道。
    crab
        9
    crab  
       2020-06-05 13:47:01 +08:00
    验证码 IP 同号次数
    waising
        10
    waising  
       2020-06-05 13:48:19 +08:00
    @yujiang #1 这...太流氓了 目前就见过建行 app 是这个操作
    geekzhu
        11
    geekzhu  
       2020-06-05 13:55:46 +08:00
    @waising #10 腾讯有一部分业务,不就一直这样么?
    easonHHH
        12
    easonHHH  
       2020-06-05 13:56:14 +08:00
    @waising #10 网易邮箱也有
    wzq001
        13
    wzq001  
       2020-06-05 14:09:11 +08:00
    参考。。。12306,升级验证码策略
    rogwan
        14
    rogwan  
       2020-06-05 14:24:27 +08:00
    1 、防无效手机号:限制 IP
    2 、防大量 IP 请求:限制峰值频率
    3 、防前端机器人:人机验证
    4 、单次发送频率限制
    5 、抛弃黑名单手机号请求

    以上几点都做了,一般成本的攻击都没问题的。
    iamverylovely
        15
    iamverylovely  
       2020-06-05 14:31:32 +08:00
    @sidegem 限制频率基本都有,不过别人恶意调用接口肯定不止一个,拿百来个这样的接口做轰炸机,每个发一两条短信就行了
    zhongjun96
        16
    zhongjun96  
       2020-06-05 15:00:18 +08:00
    @waising #10 微信,QQ 注册都这样
    akira
        17
    akira  
       2020-06-05 15:02:32 +08:00
    要求先登陆微信,唔。。。
    mandy0119
        18
    mandy0119  
       2020-06-05 15:04:18 +08:00
    首先定位 IP,这个 IP 的调用发短信的请求一律不走逻辑,直接返回成功。
    然后,最重要的是如果手机号不存在不要给前端返回手机号不存在的信息,不管手机号是否有效都返回已发送。
    很多人用这个接口是为了判断自己拿到的一批手机号是不是有效的。你返回给别人有效信息她就一直用你的调,如果你返回的信息对他无价值,时间长了他就不调你了。
    lihongming
        19
    lihongming  
       2020-06-05 15:12:05 +08:00 via iPhone
    recaptcha v3 解千愁

    不知 BAT 们有没有类似服务?
    xcstream
        20
    xcstream  
       2020-06-05 15:25:10 +08:00
    不用 http 接口
    darknoll
        21
    darknoll  
       2020-06-05 15:39:53 +08:00
    @yujiang 这种是用户体验最差的,分分钟卸载
    weizhen199
        22
    weizhen199  
       2020-06-05 15:42:01 +08:00
    运营商那边不是限定模板的嘛?
    wzq001
        23
    wzq001  
       2020-06-05 15:57:12 +08:00
    @mandy0119 我们之前是这样搞的。。。关键是,对方觉得接口没关闭,还是一直刷~!哈哈
    wzq001
        24
    wzq001  
       2020-06-05 15:59:27 +08:00
    woshipanghu
        25
    woshipanghu  
       2020-06-05 16:03:40 +08:00
    https://007.qq.com/
    图形验证码
    fdingiit
        26
    fdingiit  
       2020-06-05 16:31:39 +08:00
    @kkeiko 的 2 和 4 我在用
    尤其是 4
    arrow8899
        27
    arrow8899  
       2020-06-05 17:13:57 +08:00
    直接对接第三方的账号体系应该是最简单的
    cdkkkx
        28
    cdkkkx  
       2020-06-05 17:23:50 +08:00
    对接腾讯免费接口
    azoon
        29
    azoon  
       2020-06-05 17:47:37 +08:00
    腾讯那个防水墙现在要收费了。手机验证码必须搞第三方的个人机验证,我试过很多方法都没用,最后还是靠腾讯的服务才搞定。
    wysnylc
        30
    wysnylc  
       2020-06-05 17:57:26 +08:00
    手机号频率限制,ip 限制 用 redis 做
    gluttony
        31
    gluttony  
       2020-06-05 18:26:46 +08:00
    本机号码一键免密登录,比短验加图形验证码方便快速的多。创蓝闪验、极光认证都提供该服务,用户量大的话可以直接找三大运营商接入。
    coolcoffee
        32
    coolcoffee  
       2020-06-05 18:45:00 +08:00
    @gluttony 这个要让用户开流量访问吧,体验太差了。
    Xusually
        33
    Xusually  
       2020-06-05 18:48:16 +08:00
    接入第三方防刷验证服务
    其他的办法不用尝试了,无解
    murmur
        34
    murmur  
       2020-06-05 18:49:20 +08:00
    没有,图形验证码已经弱爆了,忘了哪个网站新的验证码要求给一个图形旋转到“正常角度”,你在玩我么
    collery
        35
    collery  
       2020-06-05 18:51:24 +08:00
    有个极验的平台,可以做二维码的
    jerryrib
        36
    jerryrib  
       2020-06-05 18:53:24 +08:00
    腾讯防水墙
    xuanbg
        37
    xuanbg  
       2020-06-06 08:19:35 +08:00
    对于攻击者来说,几乎所有的验证方法都会在高频调用这一招下失效。成功率低又如何,我可以提高频率到每秒攻击十万百万次,还是能够 1 秒钟轻松艹你千百次。

    所以真正能有效降低攻击频率的,是限流或者是低频的验证,如谷歌 Authenticator 这种动态密码。强制让所有人都只能 1 分钟只能访问一次,那就随便你攻击了。
    mostkia
        38
    mostkia  
       2020-06-06 08:36:06 +08:00
    一般大厂都做了好几层防护,首先会调用验证码,但如果有好事的用户手动反复多次通过接口发送了消息后,会分支出两种常见策略:1,直接临时停止对此 IP 的授权,关闭接口。2,改为让用户反向发送指定信息的消息到某个号码上。后者更人性化,因为无法避免一些正常用户因小概率的事件导致一直无法收到验证码,但部署成本可能比前者会高一些,前者直接后台累加到阈值阻断发送即可。
    mostkia
        39
    mostkia  
       2020-06-06 08:37:58 +08:00
    当然还有最常见的倒计时冷却,这个几乎在验证码里都是标配的,没必要特别说明
    Ravenddd
        40
    Ravenddd  
       2020-06-06 09:17:22 +08:00
    加黑名单,弄个计数器频率高的就封他 24 小时之类的,错多少次就封他几个小时之类的
    inktiger
        41
    inktiger  
       2020-06-06 09:38:58 +08:00
    作为一名爬虫工程师,我觉得对这个要看防御到什么程度,取个适中方案,要想完全防御,那不可能,你只有增加别人恶意的成本,他成本高了,你也就安全了。
    后端的话,可以用 ip 来控制每分钟获取验证码,但如果是别人换 IP 的话就不好搞,毕竟对于真想搞你的人来说,搞不同 IP 很简单,所以最好在获取短信验证码前加一层保护,如验证码,滑块、加减法、或者输入一串数字里你指定颜色的数字为验证码最终数等来防御,其实我觉得就滑块对用户而言就挺简单,而且对于恶意刷的成本也够高,要恶意刷,可能得用真实浏览器模拟用户操作,外加上还要算上生成不同 IP 来搞你,正常点的人不会抽风来专门刷的
    yukiloh
        42
    yukiloh  
       2020-06-06 15:07:52 +08:00 via Android
    需要 sign 的就可以抵挡一票人…就算人家会破也懒得弄,浪费时间…
    zzw1998
        43
    zzw1998  
       2020-06-07 03:15:31 +08:00 via iPhone
    @lihongming 话说 recaptcha v3 现在在国内可以正常用了吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   933 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:16 · PVG 04:16 · LAX 13:16 · JFK 16:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.