金算盘014975.cm登录验证机制

六月二十一日晚上十一点,我点开登录框,验证码刷了三遍,第三遍才认得出。

那天我手里有一杯泡过两次的普洱。

茶凉了。我盯着登录页。

金算盘014975.cm的登录验证机制,我原以为我看过一遍就懂了。第一次没懂。第二次也没全懂。真正看清它,是半夜十一点半,我把浏览器开发工具打开,一条一条对着看。

我不喜欢写"安全机制"。这四个字太滑。

具体说,是三道。第一道是图形验证码。第二道是会话令牌。第三道是登录后的二次校验。三道之间的间隔,比我想的长。

夜里开着的屏幕,登录验证的过程
六月二十一日,23:12。桌面上摊着一杯凉茶。

验证码,我先说这个。

它是一张 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的历史记录,读了半小时,也是同一个思路——机制先看,判断后放。不多说了。

写过的东西

10 / 10

关于我

我叫陈默。写代码,也写点记录。

住在南京,手边常有一个凉了的杯子。

这个站是我自己的笔记本,只写我亲手碰过的东西。机制、旧物、别人的代码和一句话。

不追热点。写完就放这儿,有人看见最好,没人看也行。

今天看到的一句话

"机制不是用来相信的,是用来读的。"

—— 出自 2023 年春天我贴在显示器边上的一张便利贴,原话来自某个我已记不清名字的作者