AI工具能把产品从空仓库快速推到能跑的演示版,这很管用。但一次顺畅的“快乐路径”演示,回答不了一个更棘手的问题:当用户、权限、重试、局部失败不按演示剧本走的时候,会发生什么?
倒不是说AI生成的代码天生就有问题——手写代码同样可能在这些地方翻车。真正要命的是,生成代码的速度往往快过团队定义边界、编写反向测试、记录“关键行为到底该信任到什么程度”的速度。
你不需要做一次宇宙级全量审查,只需要挑一段3到6个屏幕的用户旅程——注册、新手引导、结账、或者创建/保存/导出——把下面9条检查跑一遍就够了。
第一条,先把用户和结果说死。别一上来就“复审后端”或者“检查一下Supabase”。用一句话锁定四个东西:哪个用户或角色、第一个动作是什么、最终预期状态是什么、什么数据、钱或者权限会发生变化。举个例子:一个标准会员完成一次结账后,只收到一份有效权益,绑定在正确的账号上。这种具体到能“看得见通过还是失败”的措辞,才是真检查标准。
第二,记录好版本和运行环境。目标一直变,测试结果就没人信。需要记下的包括:提交版本或部署版本、本地/预览环境还是正式过渡环境、测试账号和角色、用的哪些清洗过的测试数据、以及哪些东西没法安全测试。诚实的结论应该是“这个行为在这些条件下被检查过”,而不是“这个App是安全的”。
第三,把每个“信任决策点”摊开来画清楚。用大白话写出完整流转:用户做了个动作、客户端发了个请求、服务器识别出这个用户和角色、有一条规则决定什么被允许、数据或权益发生变化、用户看到一个结果。在每一步追问:到底信的是哪个身份、调用方可以选择哪些值、规则究竟在哪一层被真正执行。
第四,拿错的用户或者租户来试探。对一个已经被授权可测的账号,在安全范围内试试看——改变对象ID或者租户标识,能不能摸到别人的数据或者篡改东西?界面里藏一个按钮可不算数。服务器端或者数据库层必须老老实实把越权请求拒掉。只能用清洗过的测试记录,别碰不是你的系统,也别碰你无权探测的东西。
第五,同一个动作再来一次。重试是必然会发生的:浏览器刷新、网络超时、用户狂点、服务商重复投递事件。把同一个安全请求或测试事件重复发送,看看会不会搞出重复记录、重复权益、互相矛盾的状态、重复通知,或者测试环境里来一笔错误扣款。跑之前先把“幂等行为的预期”白纸黑字写下来。
第六,调换一下顺序。外部事件可能迟到,也可能乱序到达。在受控的测试环境里,检查一项延迟的取消、完成操作或者重试,会不会覆盖掉一个更新的有效状态。如果顺序真的重要,系统应该靠持久化的状态规则守住底线,而不是靠“我觉得它应该先来”的假设活着。
第七,把每个请求杀掉一次。模拟网络中断、超时、中途取消。把请求重试和乱序重放串起来看:一个操作被中断后又被重试,有部分已经写进去了,最终结果会是什么样?数据库和外部服务之间的一致性还有没有?别只盯着成功的那条日志,得看“没走完”的那些留下了什么伤痕。
第八,盯着权限真正生效的那一刻。不是看用户能不能点按钮,而是看一个请求被身份和角色拦住、允许、降级处理的那一瞬间。检查的办法包括换角色、用失效的会话、篡改请求参数的权限、或者让访问令牌过期后重放。把每个动作在每一个角色下面允许还是拒绝,列成一张简单的表格,一目了然。
第九,用最笨的路径把流程穿一遍。键盘操作、屏幕阅读器、缩放至200%、低速网络、不支持某个API的旧浏览器——不是要追求完美无障碍,而是要确认基础访问路径没有被堵死。
跑完这9条,关键信息别烂在脑子里,写成一个一页纸的启动备忘。备忘内容要包括:版本和环境信息、哪些条件验证过了、每个检查是“通过”还是“有已知差距”、用户可见的真实风险、还有哪些操作只能在正式环境兜底处理。用“哪个用户做了什么事的结果”这种词句来写,读的人一眼就知道你在说什么,也一眼就知道你还没测到什么。
热门跟贴