ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

煋鉴扫描实录 #01:一个AI生成的FastAPI用户系统,安全得分35

煋鉴扫描实录 #01:一个AI生成的FastAPI用户系统,安全得分35 煋鉴 Xinpect扫描实录系列用真实项目代码展示煋鉴 Xinpect代码质检工具的实际检测效果。不夸大不回避只看事实。今天扫了什么一个典型的 AI 辅助开发项目——基于 FastAPI 的用户管理系统。功能包括用户注册、登录、信息查询、文件上传、数据导出、缓存管理。技术栈是 FastAPI SQLAlchemy JWT 认证264 行 Python 代码。这段代码看起来很正常接口设计规范、命名清晰、有异常处理、有日志记录。一个中级开发者看到这段代码大概率会觉得写得还行。但如果让煋鉴 Xinpect来审呢扫描配置配置项值工具版本煋鉴 Xinpectv5.9.0免费版扫描引擎7 个全启用扫描耗时0.357 秒代码行数264 行单文件语言Python 3.10扫描结果总体评分89 分通过等等——89 分看起来不错别急。看看各引擎的细分检测引擎得分问题数状态语法格式901⚠️安全与依赖357❌ 失败性能与可靠性1000✅可观测性1000✅代码质量1001✅架构与合规1000✅专项检测1000✅安全引擎得分 35 分状态为「失败」。但总分被其他 6 个满分引擎拉高到了 89最终状态是「通过」。这是一个值得警惕的现象安全评分 35 分的代码整体状态居然是「通过」。如果你只看总分这段代码会被直接合并进主分支。发现了什么共 9 个问题5 个阻断级、2 个严重级、1 个高危、1 个提示。#严重等级问题行号检测规则1 阻断Python 语法错误53SYN-PY-0012 阻断SQL 注入风险% 格式化114SEC-INJ-0023 阻断SQL 注入风险f-string137SEC-INJ-0014 阻断SQL 注入风险f-string185SEC-INJ-0015 阻断SQL 注入风险f-string201SEC-INJ-0016 严重硬编码密钥22SEC-AUTH-0037 严重不安全反序列化pickle257SEC-PY-0018 高危弱哈希算法 MD578SEC-PY-0109 提示公共函数缺少文档66QUAL-PY-004典型问题深度拆解问题一4 处 SQL 注入——最致命的通病这段代码的 SQL 查询全部使用字符串拼接没有一处使用参数化查询。原始代码第 114 行注册接口app.post(/api/register)defregister(user:UserCreate,db:SessionDepends(get_db)):querySELECT * FROM users WHERE username %s%user.usernameexistingdb.execute(query).fetchone()user.username直接来自用户输入未经任何清洗就拼入 SQL 语句。攻击者只需要在用户名中输入 OR 11就能绕过用户名检查直接创建管理员账号或者读取所有用户数据。煋鉴 Xinpect检出结果[SEC-INJ-002] SQL注入风险(%格式化) 严重等级: Blocker阻断 位置: main.py:114 描述: 使用字符串拼接构造 SQL 查询存在 SQL 注入风险 建议: 使用参数化查询ORM/prepare statement禁止字符串拼接 SQL同样的问题在第 137 行登录接口、第 185 行搜索接口、第 201 行删除接口重复出现分别使用了%格式化和 f-string 两种拼接方式。修复方法# 修复后使用 SQLAlchemy ORMexistingdb.query(User).filter(User.usernameuser.username).first()或者使用参数化查询querySELECT * FROM users WHERE username :usernameexistingdb.execute(query,{username:user.username}).fetchone()问题二硬编码密钥——JWT 形同虚设SECRET_KEYmy-super-secret-key-12345煋鉴 Xinpect检出结果[SEC-AUTH-003] 硬编码密钥 严重等级: Critical严重 位置: main.py:22 描述: 检测到硬编码密钥代码中不应硬编码敏感凭据 建议: 使用环境变量或密钥管理服务存储敏感信息这段代码的 JWT 签名密钥直接写在源码里。一旦代码泄露上传到 GitHub、被离职员工带走、被爬虫抓到任何人都可以伪造任意用户的 JWT token包括管理员。修复方法importosSECRET_KEYos.environ.get(JWT_SECRET_KEY,)ifnotSECRET_KEY:raiseRuntimeError(JWT_SECRET_KEY 环境变量未设置)问题三pickle 反序列化——远程代码执行的入口app.get(/api/cache/load)defload_cache(key:str):cache_fileos.path.join(UPLOAD_DIR,fcache_{key})withopen(cache_file,rb)asf:datapickle.load(f)return{data:data}煋鉴 Xinpect检出结果[SEC-PY-001]不安全反序列化(pickle)严重等级:Critical严重位置:main.py:257描述:pickle.load()反序列化不可信数据可导致远程代码执行建议:使用JSON替代pickle必须使用时覆盖Unpickler.find_class限制可反序列化的类这个缓存接口从文件系统读取 pickle 文件并反序列化。攻击者可以构造一个恶意 pickle 文件上传到服务器后通过这个接口触发反序列化直接执行任意系统命令——相当于拿到了服务器的完整控制权。这不是理论风险。Python 的 pickle 反序列化漏洞是 OWASP Top 10 中不安全反序列化的经典案例在真实攻击中频繁出现。修复方法importjsonapp.post(/api/cache/save)defsave_cache(key:str,data:str):cache_fileos.path.join(UPLOAD_DIR,fcache_{key}.json)withopen(cache_file,w)asf:json.dump(data,f)app.get(/api/cache/load)defload_cache(key:str):cache_fileos.path.join(UPLOAD_DIR,fcache_{key}.json)withopen(cache_file,r)asf:datajson.load(f)return{data:data}这段代码还有什么问题煋鉴 Xinpect没覆盖到的煋鉴 Xinpect扫出了 9 个问题但这段代码的问题不止这些。还有一些是煋鉴 Xinpect当前版本未覆盖或优先级较低的管理员命令执行接口第 232-239 行/api/admin/exec直接执行用户传入的系统命令没有任何权限验证。这比 SQL 注入还危险——直接就是远程命令执行。煋鉴 Xinpect的专项检测引擎没有标记这个接口可能是因为当前规则主要针对标准 sink 函数如os.system而subprocess.run的检出逻辑需要进一步强化。路径穿越第 210 行文件上传接口直接拼接文件名攻击者可以用../../etc/passwd覆盖任意文件。信息泄露第 130、144 行日志中打印了用户密码和 JWT token。XSS第 225 行XML 导出接口直接拼接用户输入没有做转义。这些问题说明即使是煋鉴 Xinpect也无法覆盖所有安全风险。但已检出的 9 个问题中有 5 个是阻断级——在真实的 CI/CD 流水线中这段代码应该被直接拦截。总结指标数据代码行数264 行扫描耗时0.357 秒问题总数9 个阻断级5 个4 个 SQL 注入 1 个语法错误严重级2 个硬编码密钥 pickle 反序列化高危1 个MD5 密码哈希安全评分35/100失败总分89/100通过这段代码看起来能跑但安全得分只有 35 分。如果直接上线SQL 注入可以在几分钟内被利用硬编码密钥一旦泄露整个认证体系崩溃pickle 反序列化则是服务器沦陷的直通车。AI 写代码越来越快但 AI 不会自动检查自己的代码有没有安全漏洞。这就是为什么我们需要工具——不是为了替代 AI而是为了给 AI 的产出加一道安全审计。关于煋鉴 Xinpect 扫描实录这是一个持续更新的系列每期用真实代码展示煋鉴 Xinpect的实际检测效果。如果你想试试扫自己的项目可以在煋鉴 Xinpect官网xinpect.xingwangzhineng.com免费体验。文中提到的任何检测方法或修复方案欢迎在评论区讨论。
返回列表