做产品 PMaker
空格的键盘空格的键盘
验证与迭代

AI 代码的安全检查

AI 代码的安全检查 | 验证与迭代 | 做产品

AI 代码的安全检查

AI 写代码又快又勤,但不会自动替你写安全的代码。它生成的代码里,翻来覆去就三类坑:密钥硬编码、越权访问、注入。上线前过一遍,三分钟就能避免一次事故。

你会遇到的现象

  • API 密钥明晃晃写在代码里,跟着仓库一起上了云

  • 接口只查了「登录了没」,没查「能不能看这条数据」

  • 用户输入直接拼进了数据库查询字符串

三类高频坑

先知道坑长什么样,才知道要查什么:

  • **密钥硬编码。**把 API 密钥、数据库密码、签名密钥直接写进代码或提交到仓库。一旦代码入库上云,密钥等于公开——攻击者拿它做合法调用,账单记在你头上。

  • **越权访问。**接口校验了「是否登录」,但没校验「能不能看这条数据」。用户 A 登录后能看用户 B 的订单、改用户 B 的资料。AI 生成的 CRUD 接口尤其容易漏这一层。

  • 注入。把用户输入直接拼进 SQL、命令、HTML。本质是把「数据」当「指令」——AI 生成代码时常用字符串拼接,恰好是最危险的那种写法。参见提示注入。

三分钟检查清单

不管代码是 AI 写的还是人写的,上线前用这份清单过一遍:

  • 一、扫密钥。用扫描工具把全仓库搜一遍:密钥、密码、Token。发现已提交的,立刻吊销重发——只是删掉远远不够,删掉的那份已经泄了。

  • **二、查每个接口的权限。**逐接口问:有没有校验登录?有没有校验「当前用户对这条数据的访问权」?测试方法很简单——用 A 的会话访问 B 的资源,看拦不拦得住。

  • **三、查所有「拼」的地方。**凡是用户输入(或任何外部输入)进入查询、命令、HTML 的地方,都要是参数化写法,而不是字符串拼接。

  • **四、让 AI 自己先自查。**生成代码时在提示词里加一句:「写出符合安全规范的版本:密钥不硬编码、每个接口校验权限、用户输入全部参数化。」效果立竿见影,成本为零。

  • **五、当流程走。**AI 代码要走和人写代码一样的评审、扫描、测试。恰恰因为代码量上来了,审查更不能省。参见走查清单。

三条里最值得亲手试一次的,是越权

用户 A 的会话

GET /orders/B-1024

403 拦住了

200 返回了 这才叫查了权限 只查了「登录没」

① 扫密钥 全仓库搜密钥、密码、Token。发现已提交的,立刻吊销重发——只是删掉远远不够。

② 查权限 逐接口问两遍:查登录了吗?查「当前用户对这条数据的访问权」了吗?

③ 查所有「拼」的地方 用户输入进入查询、命令、HTML 时,必须参数化,不能字符串拼接。

这三条三分钟就能过完,但它们挡住的是AI 生成代码里最高频的三类坑。还有一条成本为零的:在提示词里直接要求「密钥不硬编码、每个接口校验权限、用户输入全部参数化」——效果立竿见影。

为什么 AI 特别容易犯

三个原因,都跟 AI 的工作方式有关:

  • **它学的是「常见写法」。**AI 从海量代码里学「一般怎么写」。而公开代码里,密钥硬编码、不校验权限的示例比比皆是——它学到的「正常」恰好就是不安全的

  • **它只看到局部。**生成一段代码时,它看不到你的权限系统、密钥管理、安全规范。为了先让功能跑通,它默认把密钥写进代码里。

  • **它追求「能跑」,不追求「安全」。**安全是隐性质量要求,除非你在提示词里明确要求,它不会主动加。

原理讲得更细的版本在AI 代码的常见漏洞。这里只补一条认知:**别问「AI 为什么老写不安全代码」,问你自己为什么不审查。**工具提速不等于质量提高,安全这条线本来就要人来守。交给 AI 之前,先判断这单活配不配——参见什么能交给 AI。

接着看

AI 代码的常见漏洞 三类坑为什么特别容易出现在 AI 生成的代码里,原理讲透。

走查清单 安全检查是上线前那一整套走查里的一个环节。

什么能交给 AI 代码可以交,安全审查不能交——先判断这单活配不配。