项目路径: /home/dirjaker/myprojects/agent_platform
审查日期: 2026-06-21
文件数量: 21 个 Python 文件
项目类型: FastAPI + SQLite 的 LLM Agent 应用平台
- 文件:
api.py第 40 行,src/web/app.py第 29-33 行 - 问题:
allow_origins=["*"]允许任意来源访问 API,攻击者可从任何域名发起跨域请求,窃取用户数据或执行恶意操作。 - 修复: 限制为前端实际部署域名,如
allow_origins=["http://localhost:10002"],生产环境使用具体域名。
- 文件:
workflow_engine.py第 191 行 (CodeNodeExecutor.execute),tool_registry.py第 299 行 (python_execute) - 问题: 通过
exec(code, {"__builtins__": safe_builtins}, local_ns)执行用户提交的 Python 代码。所谓的 "safe_builtins" 沙箱极其容易绕过(如通过__class__.__mro__获取object基类,再调用__subclasses__()获取os模块),等同于无沙箱。 - 修复: 使用隔离的容器或进程执行用户代码(如 Docker、gVisor),或使用 RestrictedPython 等经过审计的沙箱库,绝不可在主进程内 exec。
- 文件:
tool_registry.py第 194 行 (calculate工具) - 问题:
eval(expression, {"__builtins__": {}}, allowed)虽然限制了 builtins,但通过getattr等内置函数仍可能逃逸沙箱。LLM 可被诱导构造恶意表达式。 - 修复: 使用
ast.literal_eval或专用数学表达式解析库(如simpleeval、numexpr)。
- 文件:
api.py全文,src/web/app.py全文 - 问题: 所有 API 端点(包括创建/删除应用、管理模型密钥、执行工作流)均无任何认证机制。任何人都可以访问并操作所有功能,包括读取存储的 API Key。
- 修复: 添加 API Key / JWT Token 认证中间件,敏感操作需要管理员权限。
- 文件:
workflow_engine.py第 251-289 行 (HTTPNodeExecutor) - 问题: 工作流 HTTP 节点可向任意 URL 发起请求,攻击者可借此访问内网服务(如
http://169.254.169.254获取云元数据、http://localhost:8000访问自身 API)。 - 修复: 实现 URL 白名单或黑名单机制,禁止访问内网 IP 和元数据地址。
- 文件:
tool_registry.py第 226-250 行 (read_file,write_file) - 问题:
read_file和write_file工具接受任意路径参数,LLM 或攻击者可读取/etc/passwd、写入任意文件(如~/.ssh/authorized_keys)。 - 修复: 限制文件操作在特定沙箱目录内,使用
Path.resolve()检查路径前缀。
- 文件:
config.yaml,config.py,database.py第 69-80 行 (model_providers表) - 问题: API Key 以明文存储在配置文件和数据库中。
model_providers表的api_key字段也是明文。如果数据库文件泄露,所有 API 密钥随之暴露。 - 修复: 使用环境变量或加密存储(如
keyring库),数据库中的密钥应加密后存储。
- 文件:
config.py第 39 行,api.py第 699 行 - 问题: 默认监听
0.0.0.0,暴露在所有网络接口上,在非容器环境中可能导致未授权访问。 - 修复: 开发环境默认使用
127.0.0.1,生产环境通过配置指定。
- 文件:
workflow_engine.py第 472-479 行 - 问题: 节点执行失败后仅记录日志但继续执行后续节点,可能导致级联错误或数据不一致。
- 修复: 提供可配置的错误策略(fail-fast 或 continue),默认应为 fail-fast。
- 文件:
knowledge_manager.py第 299-302 行 - 问题:
self.db.create_segment({...}) if False else None是永远不执行的死代码,影响可读性。 - 修复: 删除死代码。
- 文件:
api.py第 714-1600 行(约 900 行 HTML/CSS/JS) - 问题: 整个前端 HTML 内联在 Python 文件中,导致文件过大(67KB),难以维护和版本控制。
- 修复: 将 HTML 提取到独立的
static/index.html文件,通过 FastAPI 的StaticFiles或HTMLResponse提供服务。
- 文件:
requirements.txt - 问题: 声明了
numpy>=1.24.0和scikit-learn>=1.3.0,但代码中使用的是自定义TFIDFVectorizer,并未使用这两个库。 - 修复: 删除未使用的依赖,减少攻击面和安装体积。
- 文件:
tool_registry.py第 161 行,api.py第 25 行 - 问题: 模块导入时自动执行
_auto_load_tools()和load_tools_from_directory(),产生副作用,使单元测试困难。 - 修复: 使用延迟初始化或显式初始化函数。
- 文件:
cli.py第 10-11 行 - 问题:
sys.path.insert(0, str(Path(__file__).parent))连续出现了两次。 - 修复: 删除重复行。
- 文件:
api.py第 226-276 行 vs 第 403-467 行 - 问题:
/api/chat/stream和/api/apps/{app_id}/chat的流式生成器逻辑高度相似(约 50 行),存在重复。 - 修复: 提取公共的流式生成逻辑为独立函数。
- 文件:
api.py全文 - 问题: 无 rate limiting,容易被 DDoS 或资源耗尽。
- 修复: 使用
slowapi或 Nginx 反向代理进行限流。
- 文件:
requirements.txt - 问题: 所有依赖使用
>=范围,可能导致不同时间安装的版本不兼容。 - 修复: 使用
pip freeze生成精确版本锁定文件。
| 维度 | 得分 | 说明 |
|---|---|---|
| 安全 | 3/10 | 存在任意代码执行、无认证、CORS 全开、SSRF 等多个致命漏洞 |
| 质量 | 6/10 | 代码结构清晰,有类型注解和文档字符串,但有死代码和重复逻辑 |
| 架构 | 5/10 | 模块划分合理,但 api.py 过大(1600行),嵌入式 HTML 不利于维护 |
综合评分: 4.7/10