V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
fox0001
V2EX  ›  问与答

网站登录如何防止撞库?

  •  1
     
  •   fox0001 · 2019-01-09 16:34:36 +08:00 via Android · 7775 次点击
    这是一个创建于 1905 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司网站再次遭遇撞库。对方在圣诞节前一周,大约试了 200 万个 email 登录。估计以为会做圣诞节促销,流量暴增而会忽略其行为吧。由于登录错误的日志暴涨而被发现了。

    对方用了一大堆 IP 来撞库,大概每秒 7 个请求,一个 IP 大约隔 10 秒访问一次登录请求。而且每个 IP 都是从首页开始访问,一定程度上模拟了用户行为。

    目前网站登录错误后会要求输入图片验证码,但是该验证比较简单。虽然是个问题,但是再复杂的验证码也能破解。

    那么除了加强验证码,还能如何防止撞库?
    第 1 条附言  ·  2019-01-09 22:31:08 +08:00
    补充一下,可以理解为,对方就是个机器操作的浏览器(怀疑是 Chrome Headless ),会先访问一下网站首页,再访问登录页面,然后破解验证码尝试 email 和密码登录。 @xkeyideal 一语中的,对方本质就是个爬虫。一般不同的 email 就登录一次,有见过一个 email 尝试登录两三次的,所以应该是拿着一堆 email 和密码撞库。

    比较遗憾的是,Nginx 的 access log 只记录了访问时间、IP、访问 URL 和 Referer URL,没有浏览器信息等更多的内容。后台验证的错误信息也只有登录出错的时间、IP、email。目前不能分析用户特征,也不到知道对方什么时候再来。

    网站登录不用输入验证码。但是同一 IP 在一段时间内登录出错几次,就要求输入验证码。

    首先想到的解决方案,肯定是增强该验证码,就是复杂的验证码(可能连人类都不能识别)、极验(有破解教程)、reCAPTCHA 之类。感谢 @hilbertz 推荐,reCAPTCHA v3 可以尝试一下,据说用户只需打个勾就能验证成功。

    对于针对 IP 做限制,除非是第三方提供接口去验证 IP,否则得面对人家一个 IP 池。正如 @loading 所言。

    然后就是两步验证。但是会让正常客户觉得麻烦,估计业务人员不会采纳。
    63 条回复    2020-05-19 11:34:46 +08:00
    yksoft1ex
        1
    yksoft1ex  
       2019-01-09 16:49:47 +08:00
    用户表里面加一个异常状态,错误登陆次数过多过频直接禁止登录,要求用户修改密码。
    yksoft1ex
        2
    yksoft1ex  
       2019-01-09 16:53:53 +08:00
    或者搞个 geoip 数据库,短时间 IP 的地理位置反复更改,按异常登录处理。
    CallMeReznov
        3
    CallMeReznov  
       2019-01-09 16:57:58 +08:00
    运维方面先用 nginx 之类的过滤功能按照规则过滤一部分,可以减少一部分不必要的后端压力
    后端按照常规密码错误次数等方式屏蔽禁用账户,让客户修改密码
    fox0001
        4
    fox0001  
    OP
       2019-01-09 17:05:28 +08:00 via Android
    @yksoft1ex #1 这个撞库是一个 IP 尝试多个 email 登录。估计对方有一堆账号密码,逐个来试。所以不能记录用户帐号的异常状态
    fox0001
        5
    fox0001  
    OP
       2019-01-09 17:07:42 +08:00 via Android
    @CallMeReznov #3 这个撞库不是穷举,应该是拿着一大堆 email 和密码逐个试。要禁的话,只能禁止某 IP 一段时间不能登录
    crab
        6
    crab  
       2019-01-09 17:12:50 +08:00
    @yksoft1ex HSBC 就是这种 2B 做法。错误 3 次账号锁了,要电话客服解。
    fy
        7
    fy  
       2019-01-09 17:18:17 +08:00
    惩罚冷却怎么样,同一 IP,第一次错误 5s,30s 内第二次错误 10s,然后五六次以后增加到 30s,10 次 1min,15 次 30min,30 次 12h 以此类推
    hlwjia
        8
    hlwjia  
       2019-01-09 17:18:31 +08:00
    @crab 这一点都不 2B,当你是 HSBC 的时候你就知道了
    crab
        9
    crab  
       2019-01-09 17:30:57 +08:00
    @hlwjia 这种除了麻烦客户再去经过电话客服解除还能什么作用?如果只是密码正确就能登陆为了资金安全能理解,问题是登陆过程还需要电子设备的保安编码,总不可能撞出密码还连这个两步验证的 6 位数字都撞出啊。
    xkeyideal
        10
    xkeyideal  
       2019-01-09 17:35:07 +08:00
    本质上是个反爬虫
    CallMeReznov
        11
    CallMeReznov  
       2019-01-09 18:16:20 +08:00
    @fox0001 #5 所以我说让你在前面先规律掉一部分,一个 IP 内一分钟内有数次请求的直接 BAN 掉
    可以按照防 CC 的方式进行
    https://www.yunloc.com/167.html
    mars0prince
        12
    mars0prince  
       2019-01-09 18:20:04 +08:00
    参考微信和邮箱,换 IP 登录就要发手机验证码?
    fox0001
        13
    fox0001  
    OP
       2019-01-09 18:23:56 +08:00 via Android
    @mars0prince #12 网站没要求用户录入手机号…
    woyao
        14
    woyao  
       2019-01-09 18:24:24 +08:00
    IP 信誉了解一下 :)
    tanranran
        15
    tanranran  
       2019-01-09 18:39:46 +08:00
    加验证码,加 IP 拦截
    d5
        16
    d5  
       2019-01-09 19:14:41 +08:00
    加一层安全宝或者 CloudFlare,或者改验证码成极验、Luosimao 之类的
    d5
        17
    d5  
       2019-01-09 19:18:35 +08:00   ❤️ 1
    老接口切换成蜜罐,收集泄露的用户信息;
    新增一个登陆接口,用户页面改动到新接口;
    加一层 CloudFlare 或者安全宝;
    换验证码到极验、Luosimao。

    (事实上你随便改动一下登陆接口的路径位置、阴险地在字段加一个空格,就能让他冷却好一会儿,因为他的脚本就失效了。而空格让粗心的人防不胜防。)
    aliipay
        18
    aliipay  
       2019-01-09 19:22:58 +08:00
    @hlwjia 账号泄露了呢? 这样只会给用户带来非常大麻烦吧
    dapang1221
        19
    dapang1221  
       2019-01-09 19:27:50 +08:00
    异常流量识别是个问题,如果对方是撞库的话,肯定会出现好多未注册用户尝试登陆的情况,这是一个点,可以从这标记异常的 ip。前端可以加浏览器指纹,例如分辨率什么的,对方不是会模拟访问别的页面吗,在别的页面把数据传上来,把指纹和 ip 对应上( github 上有个 fingerprint2.js 不错),如果一个指纹或 ip 多次尝试未注册用户的登录,那所有这个请求的登录成功请求,再强行验证或绑定一下手机号,这样也不会错杀
    hilbertz
        20
    hilbertz  
       2019-01-09 19:32:37 +08:00
    recaptcha
    hanxiV2EX
        21
    hanxiV2EX  
       2019-01-09 20:00:05 +08:00 via Android
    异常流量监控,对频繁登录的做二次登录验证就好了,发邮件或者短信。
    hanxiV2EX
        22
    hanxiV2EX  
       2019-01-09 20:03:06 +08:00 via Android
    一个 ip 一天登录了两次以上就走二次验证也是可行的,正常客户端都会缓存 token 的,对正常用户没啥影响。
    fox0001
        23
    fox0001  
    OP
       2019-01-09 20:06:36 +08:00 via Android
    @d5 #17 就是使用 Web 登录界面撞库的,不是调用登录 api。就是想问问除了增强验证码(什么极验、recaptcha 之类),还有什么好方法
    loading
        24
    loading  
       2019-01-09 20:08:01 +08:00 via Android
    一次输错就出验证码。
    fox0001
        25
    fox0001  
    OP
       2019-01-09 20:10:29 +08:00 via Android
    @dapang1221 #19 不是模拟别的页面,是模拟人类访问网站。可以理解为对方就是个浏览器,但它是机器在操作。目前也只有根据访问情况,记录异常 IP 了。但如果对方的 IP 是通过类似拨号获得 IP 的话,容易误伤正常客户。网站没有记录客户手机号,强验证也只有发送 email 了
    fox0001
        26
    fox0001  
    OP
       2019-01-09 20:12:08 +08:00 via Android
    @loading #24 目测对方破解了验证码,就是能够识别验证码图片上的文字。所以问,除了加强验证码,还能如何防止撞库
    fox0001
        27
    fox0001  
    OP
       2019-01-09 20:13:51 +08:00 via Android
    @hilbertz #20 这么据说被破解了,也不是一劳永逸的方法
    loading
        28
    loading  
       2019-01-09 20:19:24 +08:00 via Android
    如果是有价值网站,除了用高强度验证码。可能还有就是短信登录或者微信扫码这种了。

    毕竟对面有 ip 池了。什么浏览器指纹这些,针对性写代码也能过的。
    loading
        29
    loading  
       2019-01-09 20:20:53 +08:00 via Android
    一般撞库一个账户只会登录一次,针对用户名是没用了,你只能限制 ip,然后你对面有一堆 ip。
    Humorce
        30
    Humorce  
       2019-01-09 20:27:18 +08:00 via iPhone   ❤️ 1
    虽然确实是技术性的讨论,大家无偿提供给你的建议你都不认同或者觉得不够好,那么你应当让公司花钱找更专业的人士去解决,而不是领一份工资死干。如果你就是花钱请回来解决问题的,那么回到第一个逗号后面重新看一次。

    试都没试过就以 据说 /可能 之类这样的字眼去回,这样不好,当然我这样回复也不好。
    hilbertz
        31
    hilbertz  
       2019-01-09 20:28:16 +08:00
    @fox0001 recaptcha v3 还没破解,即使像 v2 那样的破解,也不太可能用于大规模撞库,接入 recaptcha 就相当于 google 帮你监控用户登录行为,你不太可能找到比这个更有效的防护手段
    tabris17
        32
    tabris17  
       2019-01-09 20:30:05 +08:00
    两步验证
    tabris17
        33
    tabris17  
       2019-01-09 20:31:18 +08:00
    首先需要白名单,也就是用户常用的 IP 地理位置和登陆设备信息(包括浏览器指纹),如果地理位置异常或设备异常,就升级成两步验证
    alvin666
        34
    alvin666  
       2019-01-09 20:32:22 +08:00 via Android
    验证码呗,我见过最 bt 的码是 discuz 生成的,gif+随机中文字符(大小颜色形状不定还有干扰线)其他帧是随机数字和英文...
    用户用起来想骂娘,但是至少挡住了
    fox0001
        35
    fox0001  
    OP
       2019-01-09 22:01:27 +08:00 via Android
    @hilbertz #31 v3 目测还可以
    crab
        36
    crab  
       2019-01-09 22:02:33 +08:00
    @hilbertz 谷歌的 recaptcha 这个国内验证码没被和谐吗
    fox0001
        37
    fox0001  
    OP
       2019-01-09 22:29:16 +08:00 via Android   ❤️ 2
    @Humorce #30 在 V2 发帖前,跟同事讨论过了,也 Google 过相关的解决方案,也不尽满意。觉得做 Web 的,都会遇到这个问题,或者忽略了这个问题,大家讨论一下而已。那些天天问这问那的帖,是不是也要让他们去付费找答案?如果真需要达到一定程度的安全级别,登录就不是输个账户密码这么简单了。

    对于一份工资死干的问题,我觉得,感兴趣的事情,就算是交给第三方去处理,为什么就不能自己去想想?

    另外,这几天刚好看到 reCAPTCHA 被破解的新闻,但是没细看,所以用“据说”。个人觉得没毛病。
    gstqc
        38
    gstqc  
       2019-01-09 22:36:37 +08:00 via Android
    错 5 次封一个小时 IP,错 10 次封 24 小时,连续三天被封就永久封
    hanxiV2EX
        39
    hanxiV2EX  
       2019-01-10 00:14:01 +08:00 via Android
    二次验证只在异常情况下出现就得了,正常情况可能就第一次出现,后面就记住密码,采用 token,相当于首次换设备登录需要激活。qq 和微信都这样干的。对业务人员影响并不大吧。
    vsitebon
        40
    vsitebon  
       2019-01-10 02:29:53 +08:00 via iPhone
    使用 reCaptcha 的话,可以先观望一下这个库: https://github.com/ecthros/uncaptcha2
    BBge
        41
    BBge  
       2019-01-10 03:14:45 +08:00 via Android
    @hilbertz recaptcha 那个国内用不了吧
    BBge
        42
    BBge  
       2019-01-10 03:15:44 +08:00 via Android
    简单的 直接换腾讯的语义验证码 暂时我没了解到有打码网站能接这个活
    KasuganoSoras
        43
    KasuganoSoras  
       2019-01-10 03:22:17 +08:00
    膜一下……我之前写了个登录网页,单 IP 密码错误一次就要等 10 秒后才能再试一次,再错一次再+1s ……有一次我看到数据库里有个人错了 100 多次,+100s
    yksoft1ex
        44
    yksoft1ex  
       2019-01-10 08:10:04 +08:00
    @fox0001 那就再加个权重,同一 IP 尝试登录错误连续多少次后就进入临时黑名单。
    NicholasYX
        45
    NicholasYX  
       2019-01-10 08:14:58 +08:00 via iPhone
    加手机验证码?
    dengtongcai
        46
    dengtongcai  
       2019-01-10 08:28:44 +08:00 via iPhone
    验证码比较直接…
    bestkayle
        47
    bestkayle  
       2019-01-10 08:50:52 +08:00 via iPhone
    @fox0001 #13 没有手机号用邮箱验证吗呀
    yksoft1ex
        48
    yksoft1ex  
       2019-01-10 09:06:05 +08:00
    @bestkayle 这里的前提是邮箱密码撞库者基本掌握了,邮箱验证码没用。
    iBaoger
        49
    iBaoger  
       2019-01-10 09:08:00 +08:00 via Android
    购买一个攻击 IP 标识库,先干掉一波,剩下的自己寻找标识
    Light3
        50
    Light3  
       2019-01-10 09:13:10 +08:00
    兄弟 你先整个 难点的验证码 验证码不过 不给登陆
    压力就慢慢小了
    说实话 现在 ip 换一个 太容易了..
    之前被搞 一小时 换了 5 600 个 ip..
    bestkayle
        51
    bestkayle  
       2019-01-10 09:14:48 +08:00
    @yksoft1ex #46 要是有邮箱密码的话都能充值密码了吧,还要撞库?
    jacketma
        52
    jacketma  
       2019-01-10 10:13:01 +08:00 via Android
    双向多重防护,没有必杀技,就是攻防。用户端每个 IP 试错次数,可试次数,频率,验证码都要上,服务端对每个账号也做访问次数做限制,每个账号一天内试错三次就禁止登录,第二天解锁或者重置密码可登录。
    整体措施就是在正常用户体验和攻击难度之间取平衡点,没有一劳永逸的秘诀。
    yzkcy
        53
    yzkcy  
       2019-01-10 10:28:04 +08:00   ❤️ 6
    做安全的来说两句。
    首先,楼上评论里的"错误登陆次数过多过频直接禁止登录,或者 ban IP"都是扯淡。除了误伤正常用户,用处不大。
    真这么做了,竞争对手要笑哭了,整天撞你。

    防撞库现在主流还是验证码,既然你都知道你们验证码非常简单,那就上个难的呗。
    至于 "但是再复杂的验证码也能破解",这就是废话。
    攻击是要成本的,如果成本大于收益的话,谁还搞你?

    建议就是
    1.上个 NB 的验证码(业内很多解决方案)
    2.监测环境,二次验证
    3.收集风险账户信息,强制改密等(一些被脱过库的大站一般都这么做)
    4. ......
    locoz
        54
    locoz  
       2019-01-10 10:38:48 +08:00
    @BBge #42 有的,只是人家只给老用户用。。
    locoz
        55
    locoz  
       2019-01-10 10:48:35 +08:00
    图片验证码过于简单了,首先这个必须升级一下。
    然后就是可以用 rtbasia 这种识别 IP 真人概率的,一般 IP 量很大的那种情况,低质量 IP 占大部分,也就是真人概率比较低的那些,可以直接弹二次验证。
    还有登陆 IP 跟注册、常用 IP 不在同一个地域的也直接弹二次验证。
    jinhan13789991
        56
    jinhan13789991  
       2019-01-10 11:40:50 +08:00
    放弃密码登录,强制每次登录都输入短信验证码。
    问题解决
    zzzzzzZ
        57
    zzzzzzZ  
       2019-01-10 14:08:24 +08:00
    @yzkcy
    赞同,ban 账号和 banIP 都是扯淡,增加攻击成本才是合理的方式
    l00t
        58
    l00t  
       2019-01-10 14:56:36 +08:00
    要是我就让它撞呗。你用户的密码被人撞出来了,你自己密码没设好咯,关我什么事。要安全?我给你加个人脸识别,你愿意先存个脸在这里吗?
    arthasgxy
        59
    arthasgxy  
       2019-01-10 16:00:41 +08:00
    怎么防,我是不知道。。。
    但怎么攻,我还真知道一点。。。 处于好奇干过一点小坏事。。。

    so,其实个人感觉上面提到的最靠谱的就是加强验证码,提高攻击的难度了。。。
    当然如果对方真要想搞你,额,不知道谷歌的那种验证方案有人破掉没有。但总归,多数验证破起来难度真不大,就算搞不定,无非整个打马接口花点小钱也搞定了。

    个人推荐与其从这个角度去想,不如直接群发个邮件消息:年底盗号多发期,建议大家妥善保管密码,如有与其他网站密码相同、相似的,建议更改密码,巴拉巴拉
    arthasgxy
        60
    arthasgxy  
       2019-01-10 16:05:51 +08:00
    哦哦,对,
    如果检测到用户不是在经常登录的 ip 登录,就要用户验证下手机 or 邮箱。
    然后验证没通过的话,就给对应手机 邮箱发个消息:有人在 xx ip 尝试登录, 但验证没通过,如果不是你自己干的,说明密码泄露了,赶紧改密码
    xencdn
        61
    xencdn  
       2019-01-10 16:27:47 +08:00
    输入用户名,手动点下一步才能输入密码

    参考 https://developer.apple.com/ 这种登入方案
    coolloves
        62
    coolloves  
       2019-01-10 16:31:01 +08:00
    @crab 银行不都这样?icbc 貌似也这样
    edward8628
        63
    edward8628  
       2020-05-19 11:34:46 +08:00
    网络安全当然是层层防护啊,增加撞库成本。api 签名,蜜罐,异地登陆或不同设备登陆开启 2fa,手机或者邮箱收取验证码。其实还是收 6 位验证码最有效,但是用了验证码,被用户骂死了,被客服骂死了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1037 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:37 · PVG 06:37 · LAX 15:37 · JFK 18:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.