AI审计CMS:修好漏洞却阻断部署
作者使用AI分阶段审计CMS,修复了测验答案随接口泄露、结账金额信任客户端等问题,将答案权限和价格校验移至服务端。文章还记录了一项修复导致首次部署失败的经历,说明安全变更也需验证工具依赖。
AI 深度解读
给 CMS 做完一轮 AI 安全审计,约 620 个测试全部通过,第一次部署却卡住了。原因很直接:作者关掉了生产环境的 API 文档,而部署脚本恰好拿文档页面判断服务是否健康。
这篇记录的价值,在于把安全修复、测试盲区和发布保护串到了一起。修好业务漏洞之后,还得检查自己的工具依赖了什么;蓝绿部署则让这次遗漏停留在发布失败,没有变成用户可见的故障。
浏览器收到的数据,就不能再当成秘密
作者最初让 AI 对 CMS 做全面审计,并要求每一步都出报告。审计覆盖 UX、营销、产品和安全,他们优先处理了安全问题。
第一处问题很典型:课程测验接口把正确答案直接放进响应,只是页面没有显示。打开浏览器 Network 面板,就能看到答案。
修复方式是为学生提供一套不含答案字段的公开数据结构,只有课程编辑者能获得答案。对于前端开发者,这个边界尤其重要:组件不渲染某个字段,并没有限制用户读取它。
需要保密的数据,应当在服务端决定是否返回。
付款流程也犯了类似错误:结账时,服务端相信了浏览器提交的金额。作者最初只是想做一个不带支付的小型课程平台,后来接入收费,遗漏了这些细节。
修复后,服务端自行查询价格;支付结果回来时,再核对实付金额与应付金额。金额不匹配,就不解锁课程,并输出醒目的日志。这里有两道检查:创建订单时确定价格,支付完成后确认收款符合订单要求。
内网和清 Cookie,都不能代替服务端校验
另一个漏洞藏在支付后的课程授权接口里。它只能从作者自己的网络访问,却相信所有能够到达它的请求。
作者为它加了共享密钥,并规定:没有配置密钥时,接口直接拒绝请求。这个细节很关键。如果配置缺失反而跳过校验,部署时漏填一个环境变量,就可能重新打开入口。
退出登录的问题则是另一种「看起来完成了」:按钮清掉了浏览器 Cookie,服务端会话却一直有效,直到自然过期。
修复后,退出登录会撤销服务端会话;账号停用或修改密码时,会撤销该账号的全部会话。最终检查还包括退出接口只接受 POST。
这些修复都配了测试,三个服务合计约 620 个测试通过。但随后发生的部署失败说明,业务测试覆盖到了修复逻辑,不代表发布脚本与新行为之间的约定也得到了验证。
为什么关掉 /docs,会让健康的服务发布失败
同一晚,作者还隐藏了生产环境的 API 文档。FastAPI 默认通过 /docs 提供接口文档,作者认为陌生人不需要这份接口导览。
第一次发布随即报错:
Health checks timed out after 120s
这条错误说明部署探针等待超时,关键是 120s:它并不能单独证明业务服务已经故障。
作者采用蓝绿部署,新版本先与旧版本并行启动,健康检查通过后才切换流量。问题在于,脚本一直请求 /docs,收到页面就认为服务健康。文档入口被关掉后,新版本即使正常运行,也无法通过这项检查。
两分钟后,脚本放弃发布,旧版本继续承接流量,访客没有察觉。修复只涉及三个脚本:把探测路径从 /docs 改为专门的 /health。
健康检查依赖的地址,本身就是发布流程的一部分。
原文对 /health 的描述有一句涉及 404 的含混表述,没有交代实际状态码或响应内容。因此能确认的是作者更换了探测路径,不能据此补写健康接口的实现规范。
当晚还发生了一次指令歧义。作者说剩下的留到明天,AI 却开始停止一个已经进行到一半的部署。作者随后明确:不要启动新部署,已经开始的按约定完成。最后一个站点在次日早晨完成发布,所有站点都通过了文档关闭、POST 退出、内部路由隔离和测验不含答案等检查。
我的判断
这篇最有用的,是把安全边界落到了具体请求上:谁能拿到答案、谁决定价格、谁能调用授权接口、会话何时真正失效。它们都适合拿来检查自己的业务。
不过,关闭 /docs 的收益需要单独看。隐藏接口文档能减少公开信息,却不能替代鉴权和权限校验;接口地址不公开,也不能成为接口安全的前提。原文没有提供对照数据,不能把这一做法当成普遍适用的安全结论。
共享密钥也是作者在当前系统里的选择。文章没有交代密钥轮换、传输保护和调用方隔离,无法判断它是否适合服务更多、调用关系更复杂的团队。
专门设置 /health 比依赖文档页面更清晰,但「进程还活着」是否足够支撑流量切换,仍要看业务依赖。原文没有说明是否检查数据库等资源,也没有比较其他探测方案。
这次实际验证的是:健康检查失败时,旧版本能继续服务。约 620 个测试全部通过,则没有覆盖到文档关闭对部署脚本的影响。两者保护的是不同环节。
能拿来做什么
- 检查前端实际收到的接口响应,尤其是测验答案等敏感字段;需要限制读取的数据,应按调用者权限在服务端裁剪。
- 检查 Node 或其他后端的支付授权链路,确认订单价格由服务端确定,解锁前会核对实付金额,内部授权接口在密钥缺失时拒绝调用。
- 删除或限制一个 URL 前,搜索部署、监控和健康检查脚本中的引用;为探针设置明确的健康接口,并验证检查失败后旧版本能够继续服务。
- 让 AI 执行连续部署时,把「不再启动下一项」与「中止当前操作」分别写清楚,避免一句「先停下」改变正在执行的发布。