如何审查AI生成的代码
要审查AI生成的代码,先看改动了什么——哪些文件以及为什么改动——然后在阅读任何代码之前,亲自测试其行为。之后,检查AI代码最常出错的地方:服务器端缺少权限检查、密钥暴露给浏览器、未经验证的输入、不存在的软件包或函数,以及对你从未要求改动的内容所做的编辑。
AI写出的代码通常能运行,而且看起来很整洁。这使人很容易在没有真正检查的情况下就批准。本指南提供一套审查流程,无论你是否精通阅读代码,都同样适用。
根据风险调整审查力度
并非每个改动都需要同样的关注。
| 改动类型 | 审查方式 |
|---|---|
| 文字、颜色、布局 | 在桌面端和手机端的预览中查看 |
| 新页面或新功能 | 测试流程;略读改动过的文件 |
| 登录、权限、付款、个人数据 | 仔细阅读、实际测试,并考虑让第二个人审查 |
| 数据库结构、删除数据、数据迁移 | 阅读改动内容,在副本上测试,并先做备份 |
第1步:查看改动了什么
在评判代码之前,先获取改动的清单:
- 如果项目在Git中,查看差异:自上次提交以来改动的文件和行。参阅如何在AI构建的应用中使用Git。
- 或者直接询问AI:
列出你在上一次改动中修改过的每个文件,并用一句话解释每个文件改动了什么以及为什么。
这一阶段的危险信号:与请求无关的文件、被删除的文件、你没有要求的配置或依赖项改动。
第2步:先测试行为
阅读代码告诉你它应该做什么;测试则告诉你它实际做了什么。在阅读之前:
- 以普通用户的身份,在桌面端和手机尺寸的屏幕上试用这一改动。
- 输入错误的数据:空字段、超长文本、负数、过去的日期。
- 在未登录状态下试用,并以另一个用户的身份试用。
- 重新运行最重要的流程:注册、登录、主要操作、付款。
如果测试失败,你就节省了阅读代码的时间——清楚地报告问题,并让AI去修复。参阅如何撰写好的错误报告。
第3步:在服务器端检查权限
这是最重要的检查项。AI工具常常只是在页面中隐藏了按钮,却让服务器对任何请求该操作的人都照单全收。
对于每一个读取或修改数据的路由或函数,都要问:
- 它是否检查用户已登录?
- 它是否检查该用户被允许访问这条记录?
- 这项检查是否在服务器端,而不仅仅是在页面中?
对于你新增或修改过的每个API路由,告诉我它在服务器端做了什么权限检查,并引用对应的代码行。标出任何没有权限检查的路由。
然后进行测试:以用户A登录,记下某条记录的ID,再以用户B登录并请求该记录。AI构建应用的安全检查清单包含完整的测试方法。
第4步:查找暴露的密钥
- 在改动过的文件中搜索任何看起来像密钥或密码的内容。
- 检查密钥是否从环境变量中读取,并且只在服务器端代码中使用。
- 注意密钥变量上是否带有
VITE_或NEXT_PUBLIC_等公开前缀——这些变量会被打包进浏览器代码中。
参阅如何安全地保管API密钥。
第5步:检查输入和错误处理
- 服务器端验证。 浏览器端的检查可以被绕过。必填字段、长度、格式和允许的值,也应由服务器进行检查。
- 数据库查询使用参数,而不是把用户输入直接拼接成查询文本。
- 错误不被吞掉。 一个什么都不做的
try/catch会隐藏故障。错误应被记录,用户应看到简明的提示。 - 不向用户显示内部细节——堆栈跟踪和数据库错误应当记录在日志中。
第6步:确认代码是真实的
AI模型有时会生成看起来正确、但引用了不存在事物的代码。
- 软件包: 每个新增依赖都应是真实存在、有人维护、且名称完全正确的包。要警惕那些看起来像热门包拼写错误的名称。
- 函数和API选项: 如果代码调用了你从未见过的库函数或外部API选项,请查阅官方文档。
- 占位代码: 搜索
TODO、mock、fake、硬编码的示例数据,或返回固定值的函数。
你新增了任何软件包吗?对于每一个,请给出确切的名称、用途,以及我们是否可以不用它。
第7步:检查代码是否契合
代码可以正常运行,但仍可能让应用在日后更难修改:
- 重复。 同样的逻辑复制到多处,会逐渐产生差异。
- 一致性。 代码应遵循应用其他部分已经使用的模式。
- 规模。 一个20行的请求却生成了600行代码,值得提出疑问。
- 死代码。 与新版本并存、被遗留下来的旧版本。
由于这次改动,项目中是否有现在已不再使用的代码,或在其他地方存在重复的逻辑?不要做任何修改,只需列出来。
常见误区
- 因为看起来整洁就批准。 整洁的代码仍可能跳过权限检查。
- 只阅读不测试。 先测试,再阅读。
- 只测试正常路径。 尝试错误的输入、错误的用户以及未登录的状态。
- 忽略无关的文件改动。 询问每个文件为什么被改动。
- 完全信任自我审查。 把AI的审查当作初步检查,并通过测试加以确认。
- 一次审查整整一周的改动。 应在改动发生时,对小的改动逐一审查。
检查清单
- 我知道哪些文件被改动了、为什么改动,并且没有与之无关的改动。
- 该改动在桌面端和手机端均可正常工作,包括输入错误数据、未登录以及以其他用户身份操作的情况。
- 每个数据路由都在服务器端检查了登录状态和数据归属。
- 代码和浏览器打包文件中没有密钥。
- 输入在服务器端经过验证;查询使用了参数。
- 错误被记录而非被吞掉,且不会向用户显示详细信息。
- 新增的软件包真实且确有必要;不存在虚构的函数或占位代码。
- 高风险的改动经过了仔细阅读,并在需要时由第二个人审查。
在Mythex上审查代码
- 提问模式可以在不编辑代码的情况下回答关于代码的问题——非常适合“解释每一处改动”和“哪些路由缺少权限检查”这类提示。参阅聊天。
- 代码视图在所有套餐中都会显示文件树、编辑器和终端(免费套餐为只读,Pro套餐可编辑),方便你亲自阅读改动的内容。参阅代码编辑器。
- **
/test**会让智能体以用户身份在预览中操作,并报告有问题的流程。 - 检查点可以让你回退未通过审查的改动。
如果由开发人员为你进行审查,如何与开发人员合作完成AI构建的应用涵盖了交接事宜;如果审查中发现了错误,请参阅如何调试AI构建的应用。
常见问题
如果我不是开发人员,能审查AI生成的代码吗?
很多内容你都可以审查。检查改动是否符合你的要求,测试重要的流程,尝试访问其他用户的数据,并要求AI用平实的语言解释每个改动过的文件。涉及付款、敏感数据或安全的部分,请让开发人员也来看一看。
AI生成的代码最常见的问题有哪些?
服务器端缺少权限检查,把密钥放在了浏览器可以读取的地方,服务器端未验证输入,使用了不存在的软件包或函数,错误被悄悄吞掉,以及修改了你没有要求改动的文件。
我可以让AI审查它自己的代码吗?
可以,它常常能发现真正的问题,尤其是当你提出具体问题时,例如哪些路由缺少权限检查。把它的结果当作初步审查,而不是保证,并通过测试来确认它的发现。
代码审查应该花多长时间?
应根据风险程度来决定。文字或样式的改动只需在预览中快速看一下。涉及登录、付款、权限或数据库的改动则值得仔细阅读、实际测试,必要时请第二个人来审查。