)
Cursor、Copilot 生成的代码看着能跑但安全审查基本为零。本文用一个真实的 FastAPI 用户管理系统项目演示如何用工具化方法在上线前揪出隐藏的安全漏洞并给出完整的修复代码。问题场景你用 Cursor 或 Copilot 花 20 分钟生成了一个用户注册、登录、个人资料的 FastAPI 接口功能测试通过准备上线。但这段代码里有 -4 个 SQL 注入漏洞—— 攻击者可以直接脱库 -1 个硬编码密钥—— 任何能看到源码的人都能伪造 JWT -1 个不安全的反序列化—— 可以直接执行远程命令这些不是理论风险是上线后会被利用的漏洞。AI 编码助手在生成代码时几乎不做安全检查。它们的目标是让代码能跑不是让代码安全。所以最后这道关得你自己来。先看代码一个典型的 AI 生成的 FastAPI 项目下面这个文件是一个用户管理系统的核心代码已精简用 Cursor 基于提示词帮我写一个 FastAPI 用户管理系统包含注册、登录、个人信息查询和修改生成fromfastapiimportFastAPI,HTTPException,Dependsfromsqlalchemyimportcreate_engine,Column,Integer,Stringfromsqlalchemy.ext.declarativeimportdeclarative_basefromsqlalchemy.ormimportsessionmaker,Sessionimportjwt,hashlib,pickle,base64SECRET_KEYmy-super-secret-key-12345# ← 问题1DATABASE_URLmysql://root:root123localhost:3306/userdbenginecreate_engine(DATABASE_URL)SessionLocalsessionmaker(bindengine)Basedeclarative_base()appFastAPI()# 用户登录接口app.post(/login)deflogin(username:str,password:str):dbSessionLocal()# ← 问题2SQL注入querySELECT * FROM users WHERE username %s%usernameresultdb.execute(query).fetchone()ifresultisNone:raiseHTTPException(status_code401,detail用户不存在)ifresult.password_hash!hashlib.md5(password.encode()).hexdigest():# ← 问题3raiseHTTPException(status_code401,detail密码错误)tokenjwt.encode({user_id:result.id,role:result.is_admin},SECRET_KEY,algorithmHS256)return{token:token}# 搜索用户app.get(/users/search)defsearch_users(keyword:str):dbSessionLocal()# ← 问题4又一个SQL注入queryfSELECT * FROM users WHERE username LIKE %{keyword}%resultsdb.execute(query).fetchall()returnresults# 加载用户缓存defload_cache(cache_data:str):database64.b64decode(cache_data)returnpickle.loads(data)# ← 问题5反序列化漏洞代码看起来结构清晰有 ORM、有 JWT 认证、有日志。但它的安全问题被完全忽略了。怎么系统地查出这些问题手动 review 代码当然可以但效率低、容易遗漏。更好的做法是用自动化代码安全扫描工具每次写完代码跑一遍3 分钟出结果。我用煋鉴 Xinpectxinpect.xingwangzhineng.com扫了这段代码免费版就可以用不需要付费。扫描结果等级问题位置说明 BlockerSQL注入%格式化第114行字符串拼接SQL攻击者可直接脱库 BlockerSQL注入f-string第137行同上另一种拼接方式 BlockerSQL注入参数未过滤第185行未对用户输入做任何过滤 BlockerSQL注入动态表名第201行表名来自用户输入 Critical硬编码密钥第22行SECRET_KEY直接写在代码里 Critical不安全反序列化第257行pickle.loads可执行任意代码 High弱哈希算法第78行MD5加密密码秒破安全评分35/100属于严重不合格。逐个修复从35分到90漏洞1SQL注入4处问题原因直接用字符串拼接/格式化把用户输入塞进 SQL 语句攻击者可以通过构造恶意输入执行任意 SQL。修复方案用 SQLAlchemy 的 ORM 查询或参数化查询永远不要拼接 SQL。# ❌ 修复前querySELECT * FROM users WHERE username %s%usernameresultdb.execute(query).fetchone()# ✅ 修复后 —— 使用 ORMuserdb.query(User).filter(User.usernameusername).first()# ✅ 修复后 —— 如果必须写原生SQL用参数化fromsqlalchemyimporttextquerytext(SELECT * FROM users WHERE username :username)resultdb.execute(query,{username:username}).fetchone()漏洞2硬编码密钥问题原因SECRET_KEY my-super-secret-key-12345直接写在代码里。任何能访问代码仓库的人都能伪造 JWT token冒充任意用户。修复方案用环境变量存储密钥。# ❌ 修复前SECRET_KEYmy-super-secret-key-12345# ✅ 修复后importosSECRET_KEYos.environ.get(JWT_SECRET_KEY)ifnotSECRET_KEY:raiseRuntimeError(JWT_SECRET_KEY 环境变量未配置)部署时在环境变量或密钥管理服务中配置真实密钥值。漏洞3MD5 密码哈希问题原因MD5 早已被破解现代 GPU 每秒可以计算数十亿次 MD5密码几乎等于明文。修复方案使用 bcrypt 或 argon2。# ❌ 修复前password_hashhashlib.md5(password.encode()).hexdigest()# ✅ 修复后frompasslib.contextimportCryptContextpwd_contextCryptContext(schemes[bcrypt],deprecatedauto)# 注册时hashed_passwordpwd_context.hash(password)# 登录验证时ifnotpwd_context.verify(password,user.password_hash):raiseHTTPException(status_code401,detail密码错误)漏洞4不安全的反序列化问题原因pickle.loads()会执行序列化数据中嵌入的任意 Python 代码。攻击者只需构造一个恶意 payload就能在你的服务器上执行远程命令RCE。修复方案用 JSON 替代 pickle或者如果必须用 pickle加签名验证。# ❌ 修复前datapickle.loads(base64.b64decode(cache_data))# ✅ 修复后 —— 使用 JSONimportjsondatajson.loads(base64.b64decode(cache_data))# ✅ 修复后 —— 如果必须用 pickle加 HMAC 签名验证importhmacsignaturebase64.b64decode(sig)expectedhmac.new(SECRET_KEY.encode(),data,hashlib.sha256).digest()ifnothmac.compare_digest(signature,expected):raiseValueError(数据签名验证失败)user_datapickle.loads(data)怎么把这个流程嵌入你的开发习惯手动记住这些漏洞类型太累了。最靠谱的方式是把安全扫描接进你的开发流程让它变成像pytest一样的日常动作方式1每次提交前手动扫一次把项目代码上传到煋鉴 Xinpectxinpect.xingwangzhineng.com免费版永久免费、不限次数3 分钟出报告。适合个人项目。方式2接入 CI/CD 自动扫描在 GitHub Actions 里加一个 step每次 PR 自动触发扫描发现高危漏洞直接 block 合并。这样就不用依赖记得去检查了。方式3IDE 插件实时检测在 VS Code / Cursor 里安装安全检测插件写代码的时候就能实时看到问题。总结AI 编码工具让你的开发速度提高了 10 倍但安全检查还是得靠自己。本文演示的 5 个漏洞类型是最常见的SQL 注入—— 永远用参数化查询硬编码密钥—— 用环境变量弱哈希算法—— 用 bcrypt/argon2不安全反序列化—— 用 JSON 替代 pickle缺少输入验证—— 不信任任何用户输入最快的解决方式写完代码先过一遍安全扫描。煋鉴 Xinpectxinpect.xingwangzhineng.com免费版就能做不花钱没次数限制。如果你对代码安全审计感兴趣可以试试煋鉴 Xinpectxinpect.xingwangzhineng.com—— 免费的代码安全扫描工具支持 Python / Java / JavaScript / Go 等主流语言上传代码 3 分钟出报告永久免费、不限次数。文中提到的任何检测方法和问题修复方案欢迎在评论区讨论。