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安全早报 + 实战攻防案例 + 网安学习路线连载

关注安全值班室

posted on 2026-05-30 15:08  明.Sir  阅读(23)  评论(0)    收藏  举报

导航