文章列出 AI 生成代码中常见的密钥泄露、SQL 注入、写操作缺少鉴权及用户 HTML 引发脚本执行等问题。它强调上线前的检查机制,并指出参数化查询等标准修复方法。
最初发表于 SPOE 博客。
AI 写的代码通常能正常运行。但它是否安全,是另一个问题。答案更多取决于代码在交付给用户之前经过了哪些检查,而不是用了哪个模型。
好消息是:这些错误是可以预见的。反复出现的往往就是那几类,而且大多数都能在你不读一行代码的情况下被发现。
把密钥写进代码。 将 API key、数据库密码或支付密钥直接粘贴到文件里。一旦这个文件进入公开仓库,或被发送到浏览器,任何人都能使用其中的密钥。这是最常见、代价也最高的错误。
用字符串拼接数据库查询。 如果代码把用户输入直接拼进数据库查询,而不是将其作为独立参数传入,攻击者就能通过精心构造的输入,读取或删除不属于自己的数据。修复方法很常规,也很标准:使用参数化查询。
修改数据的路由不验证身份。 某个页面或 endpoint 可以删除记录或修改价格,却对任何找到这个地址的人开放。
直接输出用户提供的 HTML。 把访客输入的内容当作 HTML 展示,会让他们有机会在其他人的浏览器里运行自己的脚本。
接受来自任意网站的 Cookie。 过于宽松的设置,会让其他网站能够以你已登录的身份执行操作。
搜索引擎无法读取页面。 这不是安全漏洞,但 AI 构建的网站经常在没有页面标题、描述或 sitemap 的情况下就发布了,结果没人能搜到它。
问编写代码的模型,这段代码是否安全,它往往会认同自己:导致它犯错的盲点,也会影响它的检查。来自不同模型家族的审查者,会带着不同的习惯和训练背景,重新审视这次修改。这和作家不自己校对自己的书,是同一个道理。
由第二个 AI 审查每次修改。 构建 Agent 做出的每次修改,在进入你的项目之前,都会由来自不同模型家族的模型审查。如果审查发现严重问题,这次修改就会停留在并排展示的 diff 中,等待你处理,而不会直接应用。点击一下,就能把审查结果发回去,让构建 Agent 修复。审查超时或失败,绝不会被视为通过。
发布前免费检查。 Check 按钮会运行一次扫描,不使用 AI,也不消耗额度。它会检查代码中的密钥、用字符串拼接的 SQL、未经处理的 HTML、接受任意网站请求所携带 Cookie 的设置、无需登录就能修改数据的路由,以及搜索引擎会漏掉的内容。如果发现关键问题,发布就会暂停,直到你作出决定,而这个决定也会被记录下来。同样的检查工具也会以 check.mjs 的形式包含在每次导出的项目中,因此在应用的整个生命周期里,你都能在自己的机器或 CI 中运行它。
让密钥留在代码之外。 你添加的密钥会加密封存到项目的 vault 中,再通过环境变量传递给应用的服务器。构建 Agent 只会获知密钥的名称,永远不会得到密钥的值。
每次修改都保存为一个版本。 如果仍有问题漏过检查,你可以一键回滚。
没有任何检查工具能发现所有问题。无论应用由 AI 还是人来构建,在把真实客户的数据放进去之前,都要:
AI 让构建变快。检查才能让发布更安全。免费开始,在第一次构建后运行 Check,或者了解 SPOE 与其他构建工具的对比。
如果还想采取进一步措施,你可以考虑屏蔽此人,或举报滥用行为。