10 月初做全站排查的时候,我在知识库站点 wiki.igng.net(审计编号 A16 & PR #94)里揪出了两个让人哭笑不得的逻辑漏洞。

藏头露尾的父目录与莫名其妙的兜底回退

第一个坑出在目录树的可见性判断上。以前 Wiki 判断一篇文章能不能被外人看到,只呆板地检查了“这篇文章自己的状态是不是公开”。结果就是,哪怕管理员把最外层的父级文件夹设成了“隐藏/草稿”,只要有人猜到了里面子页面的路径、或者直接调客户端 API,照样能把藏在里面的子文章一字不落地读出来。

更离谱的是,早期代码里不知怎么写了一条极其诡异的兜底逻辑:当用户输错了一个根本不存在的文档网址时,页面居然不是报 404,而是默默回退显示知识库里最新发表的一篇文章!这不仅让读者一头雾水,还把内部路由状态搞得一团糟。

在 2026 年 10 月 3 日至 4 日的整改里,我把可见性校验改成了严格的完整祖先链向上追溯:读取任何一个节点,都必须一路往上查到根节点,只要祖先链上有一个目录不是公开状态,或者属于挂载断裂的孤儿节点,一律拦截;输错地址或者没权限访问时,老老实实返回真正的 HTTP 404。到了 10 月底,我又顺手把几个长期空着没写公开文档的历史旧知识库清理下线,让前台目录干干净净。

两个人同时改教程不再“谁后点保存谁赢”

第二个坑是后台多人协作时的覆盖事故。以前两个管理员如果同时点开同一篇服务器教程修改,先保存的人改的东西,会被后保存的人直接拿旧底子全盘覆盖掉。

为了解决这个问题,我在文档保存接口里加上了基于 expected_version 的 CAS(Compare-And-Swap)乐观并发锁。每次打开编辑器都会带上当前版本号,保存时如果发现数据库里的版本号已经被人抢先一步更新了,服务端会立刻返回 HTTP 409 冲突提示,提醒先把对方的改动合并进来再保存,彻底告别了“白写半小时被队友一键顶掉”的惨剧。