Vibe Coding 生成的代码,安全审计能过吗?我审了 50 个 AI 生成的函数
Vibe Coding 生成的代码,安全审计能过吗?我审了 50 个 AI 生成的函数
领导最近迷上了 Vibe Coding,让团队用 AI 辅助写代码,号称"开发效率提升 300%"。代码确实写得快了,但作为安全审计人员,我看着那些 AI 生成的代码,越看越不对劲。
于是我做了一个实验:从团队最近一个月的提交里,挑出 50 个用 AI 生成的函数,逐行做安全审计。
结果让我心里一凉——42 个函数存在安全问题,占比 84%。
不是说 AI 写的代码不能用,而是 AI 不会主动考虑安全问题。你让它写一个登录函数,它会给你一个功能完整的代码,但 SQL 注入、XSS、硬编码密钥这些坑,它踩得比人还欢。
重灾区一:SQL 注入
这是 AI 生成代码里最常见的安全问题。AI 特别喜欢用字符串拼接写 SQL:
# AI 生成的代码(有 SQL 注入风险)
def get_user(username):
query = f"SELECT * FROM users WHERE username = '{username}'"
cursor.execute(query)
return cursor.fetchone()
攻击者输入 ' OR '1'='1,直接拖库。
我审的 50 个函数里,涉及数据库操作的有 28 个,其中 21 个用了字符串拼接,只有 7 个用了参数化查询。
正确写法:
# 安全版本:参数化查询
def get_user(username):
query = "SELECT * FROM users WHERE username = %s"
cursor.execute(query, (username,))
return cursor.fetchone()
重灾区二:硬编码密钥
AI 特别喜欢在代码里直接写死密钥、token、数据库连接串:
# AI 生成的典型代码
API_KEY = "sk-1234567890abcdef"
DB_PASSWORD = "admin123"
SECRET_KEY = "my_super_secret_key_2024"
def connect_db():
return mysql.connector.connect(
host="192.168.1.100",
user="root",
password=DB_PASSWORD,
database="production"
)
我审的代码里,15 个函数有硬编码的敏感信息。更可怕的是,有些代码直接写在了前端 JavaScript 里,提交到 Git 仓库后就再也删不干净了。
正确写法:
# 使用环境变量
import os
API_KEY = os.environ.get("API_KEY")
DB_PASSWORD = os.environ.get("DB_PASSWORD")
SECRET_KEY = os.environ.get("SECRET_KEY")
def connect_db():
return mysql.connector.connect(
host=os.environ.get("DB_HOST"),
user=os.environ.get("DB_USER"),
password=DB_PASSWORD,
database=os.environ.get("DB_NAME")
)
重灾区三:XSS 漏洞
AI 生成的 Web 代码,经常直接把用户输入塞进 HTML:
// AI 生成的前端代码(有 XSS 风险)
function displayUser(userInput) {
document.getElementById("output").innerHTML = userInput;
}
// AI 生成的后端模板渲染(有 XSS 风险)
@app.route('/search')
def search():
query = request.args.get('q')
return f'<h1>搜索结果: {query}</h1>'
用户输入 <script>alert('XSS')</script>,直接弹窗。如果换成更恶毒的 payload,可以偷 cookie、钓鱼、挂马。
正确写法:
// 前端:使用 textContent 代替 innerHTML
function displayUser(userInput) {
document.getElementById("output").textContent = userInput;
}
// 后端:使用模板引擎自动转义
@app.route('/search')
def search():
query = request.args.get('q')
return render_template('search.html', query=query) # Jinja2 自动转义
重灾区四:异常处理缺失
AI 生成的代码,异常处理要么没有,要么简单粗暴:
# AI 生成的典型异常处理
try:
result = do_something()
except:
pass # 静默吞掉异常
# 或者
try:
result = do_something()
except Exception as e:
print(f"Error: {e}") # 打印到控制台,生产环境看不到
我审的代码里,32 个函数有异常处理,其中 18 个是 except: pass。这种代码在生产环境出问题时,你连错误日志都找不到。
正确写法:
import logging
logger = logging.getLogger(__name__)
def do_something():
try:
result = do_something()
return result
except ValueError as e:
logger.error(f"参数错误: {e}", exc_info=True)
raise
except DatabaseError as e:
logger.error(f"数据库错误: {e}", exc_info=True)
raise ServiceUnavailable("服务暂时不可用,请稍后重试")
except Exception as e:
logger.error(f"未知错误: {e}", exc_info=True)
raise
重灾区五:权限校验缺失
AI 生成的 API 代码,经常忘记做权限校验:
# AI 生成的 API(没有权限校验)
@app.route('/api/users/<user_id>')
def get_user(user_id):
user = db.get_user(user_id)
return jsonify(user)
@app.route('/api/admin/delete_user', methods=['POST'])
def delete_user():
user_id = request.json.get('user_id')
db.delete_user(user_id)
return jsonify({"status": "deleted"})
任何人调用 /api/admin/delete_user 都能删用户,不需要登录,不需要权限验证。
正确写法:
from functools import wraps
def login_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = request.headers.get('Authorization')
if not token or not verify_token(token):
return jsonify({"error": "Unauthorized"}), 401
return f(*args, **kwargs)
return decorated
def admin_required(f):
@wraps(f)
@login_required
def decorated(*args, **kwargs):
user = get_current_user()
if not user.is_admin:
return jsonify({"error": "Forbidden"}), 403
return f(*args, **kwargs)
return decorated
@app.route('/api/admin/delete_user', methods=['POST'])
@admin_required
def delete_user():
user_id = request.json.get('user_id')
db.delete_user(user_id)
return jsonify({"status": "deleted"})
审计数据汇总
50 个 AI 生成函数的安全审计结果:
安全问题出现次数占比 SQL 注入21/2875% 硬编码密钥15/5030% XSS 漏洞12/1867% 异常处理缺失18/3256% 权限校验缺失23/3077% 输入校验缺失25/3571% 日志记录缺失20/5040%存在至少一个安全问题的函数:42/50 = 84%
为什么 AI 写不好安全代码?
说白了,AI 是根据训练数据生成代码的。训练数据里大部分是功能代码,安全代码占比本来就低。AI 学到的是"怎么让代码跑起来",不是"怎么让代码安全地跑起来"。
而且 AI 没有安全意识。它不会想"这个输入可能被注入"、"这个密钥不能写死"、"这个接口需要鉴权"。它只关心功能是否实现。
我的建议
- AI 生成的代码必须人工审计:不能信任 AI 的安全意识
- 建立安全编码规范:把安全要求写进 Prompt,让 AI 按规范生成
- 自动化安全扫描:集成 SAST 工具(SonarQube、Semgrep)到 CI/CD
- 安全培训:让开发人员了解常见安全问题,能识别 AI 生成代码的风险
AI 是好工具,但不能替代安全意识。代码写得快不等于写得安全,效率和安全,两手都要抓。
关注「安全值班室」公众号
每天AI安全早报 + 实战攻防案例 + 网安学习路线连载
浙公网安备 33010602011771号