网站登录如何防止撞库? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fox0001
V2EX    问与答

网站登录如何防止撞库?

  •  1
     
  •   fox0001 2019-01-09 16:34:36 +08:00 via Android 8504 次点击
    这是一个创建于 2465 天前的主题,其中的信息可能已经有所发展或是发生改变。
    公司网站再次遭遇撞库。对方在圣诞节前一周,大约试了 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  
    PRO
       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。
    rzti483NAJ66l669
        30
    rzti483NAJ66l669  
       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 被破解的新闻,但是没细看,所以用“据说”。个人觉得没毛病。
    0ZXYDDu796nVCFxq
        38
    0ZXYDDu796nVCFxq  
       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
    验证码比较直接…
    KgM4gLtF0shViDH3
        47
    KgM4gLtF0shViDH3  
       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..
    KgM4gLtF0shViDH3
        51
    KgM4gLtF0shViDH3  
       2019-01-10 09:14:48 +08:00
    @yksoft1ex #46 要是有邮箱密码的话都能充值密码了吧,还要撞库?
    jacketma
        52
    jacketma  
       2019-01-10 10:13:01 +08:00 via Android
    双向多重防护,没有必杀技,就是攻防。用户端每个 IP 试错次数,可试次数,频率,验证码都要上,服务端对每个账号也做访问次数做限制,每个账号一天内试错三次就禁止登录,第二天解锁或者重置密码可登录。
    整体措施就是在正常用户体验和攻击难度之间取平衡点,没有一劳永逸的秘诀。
    lorryo
        53
    lorryo  
       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 账号和 bnIP 都是扯淡,增加攻击成本才是合理的方式
    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/ 这种登入方案
    sparkssssssss
        62
    sparkssssssss  
       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     Solana     5792 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 06:16 PVG 14:16 LAX 23:16 JFK 02:16
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86