别再怪用户被钓鱼了:Authentication架构才是罪魁祸首
别再拿"别点可疑链接"当挡箭牌了
每年安全培训都在重复同一套说教:检查网址、看有没有HTTPS、不认识的网站别输密码。道理是没错。但实际情况呢?我们把登录系统搞得越来越复杂,简直就是在让用户解谜题,而且答案每个季度还得换。
说句不爱听的:钓鱼攻击很多时候不是用户的问题,是系统架构的问题。
合法的网站看起来也像诈骗
看看你自己公司的登录流程。如果是普通公司,那个登录按钮大概率会把用户绕晕——一堆第三方身份服务商、联邦认证服务、token接口,URL长得跟钓鱼网站似的。
https://app.yourcompany.com →
https://auth.identityprovider.io/yourcompany →
https://sso.federatedservice.com/session/token →
https://verify.authentication-processor.com/mfa
这些URL没一个在自己公司的域名下。没一个记得住。也没一个能让用户分清真假。
攻击者要搞这一套,其实只需要三样东西:一个像样的页面模板、一张偷来的logo、一个密码输入框。URL本身早就没什么意义了,因为我们已经把用户训练成无视URL的人了。
URL这玩意儿从一开始就不是给普通用户设计的
说实话,URL的结构本身就反人类,指望普通用户像程序员那样分析它,不现实。
看这个URL:
https://login.staging.internal.example-corp.com/auth/verify
普通用户看到"staging"和"internal",脑子就死机了。他们就想找公司名,好不容易找到了,也分不清周围这套基础设施到底是官方正版还是高仿。
域名是从具体到一般这么读的(login → staging → internal → example-corp → com),也就是说最重要的标识——真正的域名——被埋在了中间。用户学会了在URL里随便哪个位置找品牌名,巧了,这正是钓鱼佬利用的习惯。
协议 → 子域名 → 主域名 → 顶级域 → 路径
| | | | |
HTTPS login example com /auth
程序员看这些一目了然。普通用户?遇到这种标准操作的URL,根本没活路:
https://auth.company.suspicious-vendor.io
https://company.auth-vendor.io/sso/abc123
https://auth-vendor.io/company-signin
程序员该担起这个责任
重点来了:你有能力设计出保护用户的认证体验,而且是默认就保护。
别再把用户绕进第三方域名的迷宫了,记住这几个原则:
1. 认证域名要握在自己手里。 你的主品牌域名应该负责登录。如果非要用第三方身份服务商,至少要套上自己的子域名:
✓ https://login.yourcompany.com
✗ https://auth.vendor.com/yourcompany
2. 子域名层级要统一。
主应用在app.company.com,那认证就应该是auth.company.com——别把自己塞进别人基础设施的三层嵌套里。
3. 跳转要聪明。 如果必须链到外部服务(问卷、支付、客服),就用自己域名的服务端跳转。这样用户看到的始终是熟悉的环境,也让他们记住"不是我们域名的东西,都不是我们的"。
4. 短信和电话号码跟链接同等对待。 "打这个电话"或者"收这个验证码"的短信,跟邮件链接一样危险。联系方式要放在用户本来就信任的页面上。
安全的系统应该帮用户,不是难为用户
RFC 2119那些术语不是官僚废话,是一种设计理念。当认证安全只是"建议"而不是"必须"的时候,就成了现在这样——联邦身份服务满天飞,正规网站跟钓鱼网站长得一模一样。
真正能赢安全这场仗的公司,是那些不再把用户当短板,而是开始做让安全选项变成最简单选项的系统。
说白了:靠培训解决不了设计缺陷。
对创业公司和企业的建议
如果你在做或者维护登录流程,现在就该检查一遍。问自己几个问题:
- 第一次用的用户,能光看URL就认出你的登录页吗?
- 所有需要登录的地方,域名都是用户认识的吗?
- 用第三方服务的时候,是用了他们提供的域名还是自己的?
这不只是做做安全的样子,是建立信任。用户对你的登录体验有信心,才会真的信任你的产品。
在 NameOcean,我们见过域名策略和安全架构是怎么互相影响的。域名不只是一个地址——它是用户信任的根基。让它帮你,不是坑你。