游客发表
去年秋天,商业一家做跨境电商的网站朋友半夜给我打电话,说后台有三十多个用户账号在十分钟内被洗劫一空,预防余额全转走了。盗号他以为是商业被黑客拖库,结果查日志发现,网站攻击者用的预防全是正确的用户名和密码——这些密码来自三年前某论坛泄露的旧数据。撞库,盗号这个老掉牙的商业手法,至今仍是网站商业网站失窃的头号通道。
很多人把防盗号理解成"把密码加密存好",预防这远远不够。盗号密码哈希做得再漂亮,商业挡不住用户在别处用同一个密码。网站攻击者手里握着几十亿条泄露凭证,预防写个脚本批量试,成本几乎为零。你的网站只要有一个接口没有速率限制,或者登录失败后不触发任何风控,就等于敞开大门。
我见过最离谱的一个案例:某中型SaaS平台,登录接口对同一IP的请求次数完全不设限。安全团队后来复盘,攻击者用一台VPS,每秒发两百次登录请求,跑了整整一个下午,撞开了四千多个账号。平台不是没有WAF,但WAF只拦SQL注入和XSS,对这种"合法请求"视而不见。
所以第一道防线得放在登录环节。具体做法不复杂:同一账号连续失败五次,锁定十五分钟;同一IP每分钟登录请求超过二十次,直接限流。这两条规则加起来不到五十行代码,能挡掉九成以上的自动化撞库。别嫌误伤,正常用户不会一分钟输错五次密码。
光靠限流还不够。商业网站有个天然优势——它有用户行为数据。一个账号平时都在上海登录,突然凌晨三点从越南IP进来,还直奔提现页面,这信号够明显了。我建议中小团队至少做一层"异地登录二次验证":检测到IP归属地突变,强制发邮件或短信验证码。成本低,效果立竿见影。有个做在线教育的客户上线这个功能后,盗号投诉量当月降了七成。
密码本身也得管。别再用MD5、SHA1存密码了,bcrypt或者argon2才是现在该用的。加盐、慢哈希,让攻击者就算拖了库也跑不动。另外,强制密码复杂度这事要适度——要求大小写加数字加符号,用户记不住,反而会写在便签上或者到处复用。NIST最新的建议是:长度比复杂度重要,八个字符以上、检查是否在泄露密码库中出现过,比逼用户加感叹号有用得多。
还有个容易被忽略的入口:第三方登录和OAuth回调。有些网站接微信、Google登录时,回调地址没做严格校验,攻击者可以构造恶意redirect_uri把授权码劫持走。这类漏洞在代码审计里很常见,但业务方往往觉得"用了大厂SDK就安全了"。SDK没问题,是你的集成方式有问题。
最后说个反直觉的观点:防盗号不是安全团队一个部门的事。产品经理设计"记住我"功能时选多长的token有效期,运营做促销活动时会不会把用户手机号明文导出来发短信,客服在处理"账号被盗"投诉时有没有权限直接重置密码——这些日常决策对账号安全的影响,比防火墙规则大得多。我见过一家公司,安全团队把登录接口守得铁桶一般,结果运营在测试环境用真实用户数据跑脚本,测试库密码是"123456",拖库事件就这么来的。
防盗号没有一劳永逸的方案。攻击者在进化,你的防御也得跟着调。但上面这几条做到位,至少能让绝大多数脚本小子绕道走。剩下的,就看你能不能在用户体验和安全之间找到那个平衡点了。
友情链接