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

网站登录如何防止撞库?

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

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

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

    那么除了加强验证码,还能如何防止撞库?
    第 1 条附言  ·  308 天前
    补充一下,可以理解为,对方就是个机器操作的浏览器(怀疑是 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 所言。

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

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

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

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

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

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

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

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

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

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

    参考 https://developer.apple.com/ 这种登入方案
        62
    coolloves   307 天前
    @crab 银行不都这样?icbc 貌似也这样
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   938 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 32ms · UTC 22:01 · PVG 06:01 · LAX 14:01 · JFK 17:01
    ♥ Do have faith in what you're doing.