vibe coding 安全指南:守住 AI 生成代码的安全边界

infisical 发布于 2025-04-03 阅读 189

文章围绕“vibe coding”这一借助 AI 生成代码的新开发方式,重点讨论其安全风险与防护思路。作者从 OWASP Top 10 出发,结合硬编码密钥、SQL 注入、XSS、弱认证等典型问题,说明 AI 生成代码常因缺乏上下文、安全意识不足而埋下隐患,并给出环境变量、参数化查询、输入转义、bcrypt、速率限制等安全替代方案。同时强调应通过安全导向的 Prompt、分阶段审查、自动化扫描和安全基础知识学习,把 AI 当作协作者而不是可信终点。

什么是 Vibe Coding?

Vibe coding 是一个由 Andrej Karpathy 提出的新术语,用来描述一种利用 AI 工具处理大部分编码工作的全新软件开发方式。在一条迅速传播的推文中,他解释道:

有一种我称之为“vibe coding”的新型编码方式,在这种方式中,你完全沉浸于感觉之中,拥抱指数级增长,并且忘记代码本身的存在。这之所以成为可能,是因为 LLM(例如带有 Sonnet 的 Cursor Composer)已经变得太强了。而且我还通过 SuperWhisper 与 Composer 交谈,所以我几乎连键盘都不用碰。 [...] 我只是看到东西,说出东西,运行东西,复制粘贴东西,而它大多数时候都能工作。

Vibe coding 高度依赖 AI 工具来生成、改进和调试代码,使开发者能够以极少的手动编码工作快速迭代并部署应用程序。

这种做法正在迅速流行,并已被《纽约时报》Ars Technica《卫报》以及无数在线讨论所报道。

它尤其吸引那些还不会写代码、却想创建自己应用的人,无论是为了娱乐还是盈利。然而,如果开发者不仔细审查,过度依赖 AI 生成的代码可能会导致安全漏洞、低效率和错误。

OWASP Top 10:Vibe Coders 的安全基础

在深入讨论具体漏洞之前,我们先明确为什么安全性对 vibe coders 很重要。OWASP Top 10 代表了最关键的 Web 应用安全风险,并为理解 AI 生成代码中的潜在问题提供了极佳的框架。

AI 代码生成器存在一些特定局限,这使它们容易引入这些安全问题:

局限 描述 安全影响
模式复现 AI 会复现训练数据中的代码模式,而不理解其安全影响 可能会复现公共代码仓库中常见的脆弱代码
上下文盲区 AI 缺乏对更广泛应用安全上下文的感知 生成的代码单独看可能是安全的,但集成后会产生漏洞
基于遗留代码训练 大量训练数据包含过时的安全实践 传播不符合现代安全标准的已弃用模式
实现不完整 AI 更关注功能需求,而不是安全需求 省略关键的校验、错误处理和安全检查

AI 生成代码中的主要安全风险

下面来看看你在使用 AI 编码助手时最可能遇到的关键安全漏洞,并为每种漏洞提供实际示例和解决方案。

1. 数据安全漏洞

硬编码凭据与暴露的密钥

AI 代码助手经常建议将凭据直接硬编码到源代码中。请看这个例子:

import { Pool } from 'pg';

// 创建到 PostgreSQL 的连接池
const pool = new Pool({
  user: 'postgres',
  host: 'localhost',
  database: 'myapp',
  password: 'admin123',  // 硬编码密码!
  port: 5432,
});

这种做法会带来严重漏洞,因为:

  • 任何能够访问代码库的人都可以看到凭据
  • 密钥可能会永久保留在 git 历史中
  • 轮换凭据需要修改代码
  • 不同环境需要不同的硬编码凭据版本

根据 GitGuardian 最近的一份报告,仅去年一年,就有近 2400 万个密钥被意外暴露在 GitHub 上,而使用 AI 编码工具的代码仓库,其密钥暴露率高出 40%。

阅读:什么是 Secret Sprawl 以及如何解决它?

最近甚至有人提出担忧:具备整个代码库读取权限的 AI 编码助手,可能会将存储在 .env 文件中的敏感凭据泄露到远程服务器,或者覆盖 .gitignore 文件,从而导致将敏感的 .env 文件提交到 git 的风险。

安全替代方案: 使用环境变量或专用的密钥管理解决方案。下面是一个简单的环境变量方案:

import { Pool } from 'pg';

// 使用环境变量创建连接池
const pool = new Pool({
  user: process.env.DB_USER,
  host: process.env.DB_HOST,
  database: process.env.DB_NAME,
  password: process.env.DB_PASSWORD,
  port: parseInt(process.env.DB_PORT || '5432'),
});

对于更稳健的方案,可以考虑使用专用的密钥管理器,例如 Infisical、AWS Secrets Manager 或 HashiCorp Vault,它们提供:

  • 代码与凭据分离
  • 细粒度访问控制
  • 自动化密钥轮换
  • 审计日志能力
  • 针对不同环境的配置

2. 输入校验漏洞

SQL 注入

AI 生成的代码通常优先考虑功能而非安全,从而导致不安全的数据库查询:

// 易受攻击的代码
import { Pool } from 'pg';

export async function getUserData(username: string): Promise<any> {
  const pool = new Pool();
  const query = `SELECT * FROM users WHERE username = '${username}'`;
  const result = await pool.query(query);
  return result.rows[0];
}

这段代码直接将用户输入拼接进 SQL 查询中,没有做适当的清理或参数化处理。攻击者可以输入像 admin' OR '1'='1 这样的值,以绕过身份验证或执行任意 SQL 命令。

安全替代方案:

// 安全代码
import { Pool } from 'pg';

export async function getUserData(username: string): Promise<any> {
  const pool = new Pool();
  // 使用参数化查询来防止 SQL 注入
  const query = 'SELECT * FROM users WHERE username = $1';
  const result = await pool.query(query, [username]);
  return result.rows[0];
}

跨站脚本攻击(XSS)

AI 助手常常遗漏适当的输出编码,从而造成 XSS 漏洞:

// 易受攻击的代码
import express from 'express';

const app = express();

app.get('/search', (req, res) => {
  const searchTerm = req.query.term as string;
  res.send(`<h1>Search results for: ${searchTerm}</h1>`);
});

这段代码直接将用户输入插入 HTML 中,没有进行清理,从而允许攻击者注入恶意脚本,并在用户的浏览器中执行。

安全替代方案:

// 安全代码
import express from 'express';
import escapeHtml from 'escape-html';

const app = express();

app.get('/search', (req, res) => {
  const searchTerm = escapeHtml(req.query.term as string);
  res.send(`<h1>Search results for: ${searchTerm}</h1>`);
});

3. 身份认证与授权缺陷

AI 助手通常会生成处理用户身份认证的代码,但缺少关键的安全防护:

// 易受攻击的代码
function loginUser(username, password) {
  const user = findUserByUsername(username);
  if (user && user.password === password) {
    return generateToken(user.id);
  }
  return null;
}

这种实现存在多个安全问题:

  • 密码以明文进行比较,而不是进行哈希比对
  • 没有防止暴力破解攻击的保护
  • 没有账户锁定机制
  • 没有记录登录失败的尝试

安全替代方案:

// 安全代码
import bcrypt from 'bcrypt';

async function loginUser(username, password, ip) {
  // 速率限制检查
  if (isRateLimited(ip)) {
    logFailedAttempt(ip, username, 'rate_limited');
    throw new Error('尝试次数过多,请稍后再试。');
  }

  const user = await findUserByUsername(username);

  // 即使未找到用户,也始终执行哈希比较,以防止时序攻击
  const passwordValid = user ? await bcrypt.compare(password, user.passwordHash) : false;

  if (!user || !passwordValid) {
    logFailedAttempt(ip, username, 'invalid_credentials');
    throw new Error('用户名或密码无效');
  }

  return generateToken(user.id);
}

Vibe Coders 的安全审查指南

在审查 AI 生成的代码时,请特别警惕以下常见预警信号:

安全红旗

  • 敏感信息暴露
    • 硬编码的凭据、API key 或 Token
    • 包含嵌入式密码的数据库连接字符串
    • 泄露内部细节的调试或错误信息
  • 不安全的数据处理
    • 未参数化的查询(SQL、NoSQL、LDAP)
    • 将用户输入直接插入 HTML、JavaScript 或命令字符串
    • 缺少输入校验,或仅依赖客户端校验
  • 薄弱的安全控制
    • 会泄露敏感信息的不充分错误处理
    • 缺失或薄弱的身份认证机制
    • 对敏感功能缺少授权检查
    • 过时的加密方法(MD5、SHA1、DES)
  • 配置问题
    • 在生产代码中启用了开发功能
    • 过于宽松的 CORS 设置
    • 默认启用了不必要的服务或功能

安全进行 Vibe Coding 的最佳实践

实施以下实用指南,以在最大化 AI 代码助手收益的同时,将安全风险降到最低:

面向安全的 Prompt Engineering

你组织 Prompt 的方式会显著影响生成代码的安全性:

不要这样:

Write me a login function

试试这样:

Write a secure login function using bcrypt for password hashing, with rate limiting and protection against timing attacks, following OWASP best practices

多阶段安全审查

在处理 AI 生成的代码时,采用以下审查工作流:

  1. 初始生成:先得到可工作的代码解决方案

  2. 安全验证:继续使用如下 Prompt:

    • “这段代码中可能存在哪些安全漏洞?”
    • “我们如何改进错误处理以防止信息泄露?”
    • “是否存在任何可能导致安全问题的边界情况?”
  3. 挑战测试:使用问题输入进行测试:

    • “如果用户输入是:admin'; DROP TABLE users; --,这段代码会如何处理?”
    • “如果上传的文件包含恶意内容,会发生什么?”

自动化安全检查

将安全工具集成到你的开发工作流中:

安全层 可考虑的工具
代码分析 SonarQube、ESLint Security Plugin、Semgrep
依赖扫描 OWASP Dependency-Check、Snyk、GitHub Dependabot
密钥检测 GitLeaks、TruffleHog、detect-secrets
运行时保护 RASP 工具、WAF 配置

学习核心安全概念

即使你的编码经验很少,理解这些基础安全原则也将帮助你评估 AI 生成的代码:

  • 纵深防御:多层防护优于单一强防线
  • 最小权限原则:只给组件完成任务所绝对需要的访问权限
  • 输入校验:绝不要在未正确校验的情况下信任外部输入
  • 默认安全:从最安全的配置开始,只开放必要部分

结论:负责任的 Vibe Coding

Vibe coding 是一项令人兴奋的发展,它让软件创作比以往任何时候都更容易被更多人接触。然而,随之而来的也有责任,尤其是在安全方面。

把 AI 助手当作协作者,它们的工作需要仔细审查,而不是把它们当作不会出错、代码可以被盲目信任的专家。通过应用本手册中概述的安全原则,你可以更有信心地进行 vibe coding,同时确保你的应用保持安全。

请记住:最安全的代码,是你理解的代码。花时间让你的 AI 助手解释它在安全方面的选择,并在这个过程中不断学习。

接下来,请查看我们的指南:如何管理你的 MCP servers 中的密钥,了解如何确保你的密钥安全可靠。

Thomas Segura

技术作者,Infisical

  • 原文链接: infisical.com/blog/vibe-...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论