那天我手里有一杯泡过两次的普洱。
茶凉了。我盯着登录页。
金算盘014975.cm的登录验证机制,我原以为我看过一遍就懂了。第一次没懂。第二次也没全懂。真正看清它,是半夜十一点半,我把浏览器开发工具打开,一条一条对着看。
我不喜欢写"安全机制"。这四个字太滑。
具体说,是三道。第一道是图形验证码。第二道是会话令牌。第三道是登录后的二次校验。三道之间的间隔,比我想的长。
验证码,我先说这个。
它是一张 120×40 的图。字符四位。刷新按钮在右边,是个小箭头。我连点了三下,前两张都在 0.4 秒内回来,第三张等了 2.1 秒。灯是绿的,图却是空的。我刷新了页面,才重新出来。
这不是故障。这是我在那一刻的判断,后来也验证了。
验证码请求走的是一个独立的接口,返回里带 captcha_id,有效期 120 秒。问题在于,新验证码请求回来时,旧的 captcha_id 并不会立即作废。我试过:用旧的 id 配合新输入的字符提交,系统仍然放行。这是个边界。不是漏洞,是边界。安全机制里这种边界很多,多数人不去碰。
边界不是错误。边界是机制留给你不去看的地方。
第二道是会话令牌。
登录请求成功后,响应头里有一个 Set-Cookie。名字很长,不写了。关键在于,它带 HttpOnly、Secure、SameSite=Lax 三个标记,有效期 30 分钟。30 分钟这个数字,我第一次输进去后注意到了。它比我预期短。
短是风险,也是姿态。
我把有效期硬编码去试过一次,服务器在第十九分钟给了新的令牌,旧的作废,前端静默替换。用户感觉不到,会话却被延长了。这叫滑动续期。做得很干净,前端没有闪屏。
第三道,是登录后的二次校验。这一道最容易被忽略。
它出现在你第一次进入账单页的时候。不是弹窗,是一个静默的 POST /verify 请求。带两个参数:会话令牌哈希和解锁口令。解锁口令是登录时输入密码的派生值,前端不存明文,算完就丢。我第一次看到这个请求,是在 Network 面板里一行淡灰色小字。它跑了 180 毫秒。我差点忽略。
第三道是真正的门。
关于前两道,我的看法是:图形验证码做得一般,字符可读但干扰线偏弱,OCR 有概率过。会话令牌做得扎实。第三道,才是这套机制真正的区分度所在。
我提的朋友里,做前端的林舟,六月七号那天给三个站点做登录审计,他的结论是"第一道都靠不住,别指望它"。我同意一半。图形验证码不是防线,是缓冲。真正要防的东西,第二、第三道已经拦了。
这是我今天唯一想说的观点。
昨晚我重新登录了一次。这次我记了时间。验证码 0.6 秒,令牌 30 分钟,二次校验 180 毫秒。三个数字,不多。我关掉开发工具,喝完了那杯凉茶。
要理解一个机制,你不需要读它全部的说明。你需要一个夜晚,一杯茶,和不去"安全"二字里打转的耐心。
我把这篇留下来。算是给自己一个记录。
顺带一提,前两天翻到一个旧站的记录,标题是 新奥门62692的历史记录,读了半小时,也是同一个思路——机制先看,判断后放。不多说了。