ChatGPT生成的代码存在SQL注入、硬编码密钥等安全风险,因其不遵循最小权限原则且缺乏攻防经验;需通过Semgrep扫描、人工核查三要点、Bandit检测完成审计,并采用安全约束提问、防御性模板及function calling校验提升安全性。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

当你把ChatGPT生成的代码直接放进生产环境跑起来,系统突然开始返回500错误、数据库连接被异常重置、或日志里反复出现未授权访问告警——这些不是偶然,而是模型输出未经安全审计的典型后果。
为什么ChatGPT生成的代码自带漏洞风险
ChatGPT不理解“最小权限原则”,也不会主动对用户输入做转义或校验。它只是按概率拼接出语法通顺的代码,比如你让它“写个登录接口”,它可能直接拼出 query = f"SELECT * FROM users WHERE name = '{username}'" ——这行代码在训练语料中高频出现,但它就是SQL注入温床。
模型没见过真实攻防对抗日志,也从未执行过渗透测试。它生成的JWT签发逻辑可能硬编码密钥,文件上传路径可能拼接用户可控参数,密码哈希可能用MD5——这些都不是疏忽,是能力边界决定的必然结果。
【所有未经人工逐行验证的ChatGPT输出代码,都应视为待审计的高危资产】
三步完成基础安全审计
第一步:用Semgrep扫描硬编码凭证与危险函数调用
安装Semgrep后运行:semgrep --config=p/ci --config=p/security-audit your_code/。它能立刻揪出os.system()、eval()、明文API_KEY赋值等17类高危模式。
第二步:人工聚焦三处必查点
① 所有外部输入入口(HTTP参数、文件读取、环境变量)是否经过白名单校验或强类型转换;
② 所有数据库查询是否使用参数化语句,而非字符串拼接;
③ 所有敏感操作(删库、发邮件、调支付)是否强制二次确认或异步审批。
用于在用户想通过浏览器自动化与 Google Gemini 或 ChatGPT 交互时。触发短语包括“ask Gemini”“ask ChatGPT”“ask GPT”“让...”。
第三步:用Bandit检测Python安全缺陷
执行 bandit -r . -s B101,B102,B601,B602,B603,B607。重点盯B602(subprocess调用)、B607(shell=True风险)和B101(assert误作条件检查)——这三项占ChatGPT生成Python漏洞的68%。
优化生成结果的实操方法
方法一:在提问时嵌入安全约束词
不要问“写一个用户注册API”,改问:“用FastAPI写用户注册API,要求:1.邮箱字段强制RFC5322校验 2.密码用bcrypt哈希且盐值随机 3.所有SQL查询用SQLModel参数化 4.响应不返回内部错误详情”。模型会把约束词当优先级信号,生成质量明显提升。
方法二:用“防御性模板”框定输出结构
给ChatGPT提供如下模板:
```python<br># [功能简述]<br># 安全要求:[具体条款,如“禁止字符串拼接SQL”]<br># 输入校验:[明确规则]<br># 错误处理:[返回通用码,不暴露堆栈]
再让其填充代码。模板本身就能过滤掉约40%的默认危险写法。
方法三:启用OpenAI的function calling + 自定义安全校验工具
在调用API时配置tools数组,加入validate_sql_safety、check_password_policy等自定义函数。模型生成代码后自动触发校验,不通过则拒收——这比事后审计快一个数量级。
必须立即停用的五类生成代码
① 含exec()、eval()、compile()的动态执行逻辑
② 使用os.popen()、subprocess.Popen(shell=True)的系统调用
③ JWT密钥、数据库密码、云服务Token写死在源码里的配置
④ 没有CSRF Token验证的POST表单处理代码
⑤ 对用户上传文件名不做清洗就拼进open()路径的文件操作
这五类代码只要出现任意一行,整段输出必须废弃重写,不可修补。

















