Skip to content

Latest commit

 

History

History
408 lines (324 loc) · 15 KB

File metadata and controls

408 lines (324 loc) · 15 KB

架构设计与性能优化

本文档面向架构师和高级开发者,深入剖析系统架构设计、并发模型、SQLMap 集成原理、插件架构和性能优化策略。

1. 系统架构总览

1.1 三层架构

┌─────────────────────────────────────────────────────┐
│                    前端层 (Vue 3)                     │
│  ┌─────────┐ ┌──────────┐ ┌──────┐ ┌────────────┐  │
│  │  Home   │ │ TaskList │ │Config│ │   AddTask   │  │
│  └────┬────┘ └────┬─────┘ └──┬───┘ └──────┬─────┘  │
│       └───────────┴──────────┴─────────────┘        │
│                        │ HTTP/WebSocket              │
├────────────────────────┼────────────────────────────┤
│                    后端层 (FastAPI)                    │
│  ┌──────────────────────────────────────────────┐   │
│  │              API 路由层 (Router)              │   │
│  │  ┌──────────┐ ┌──────────┐ ┌─────────────┐  │   │
│  │  │  webApi  │ │burpExApi │ │  commonApi  │  │   │
│  │  └────┬─────┘ └────┬─────┘ └──────┬──────┘  │   │
│  └───────┼─────────────┼──────────────┼─────────┘   │
│  ┌───────┴─────────────┴──────────────┴─────────┐   │
│  │            服务层 (Service)                    │   │
│  │  ┌──────────┐ ┌───────────────┐ ┌─────────┐  │   │
│  │  │taskService│ │headerRuleSvc  │ │scanPreset│  │   │
│  │  └────┬─────┘ └───────┬───────┘ └────┬─────┘  │   │
│  └───────┼───────────────┼──────────────┼────────┘   │
│  ┌───────┴───────────────┴──────────────┴────────┐   │
│  │            模型层 (Model)                      │   │
│  │  ┌──────┐ ┌──────────────┐ ┌──────────────┐   │   │
│  │  │ Task │ │HeaderRule    │ │SessionBody   │   │   │
│  │  └──┬───┘ └──────┬───────┘ └──────┬───────┘   │   │
│  └─────┼────────────┼───────────────┼────────────┘   │
│  ┌─────┴────────────┴───────────────┴────────────┐   │
│  │            数据存储 (DataStore)                 │   │
│  │  ┌──────────┐ ┌────────────────────────────┐  │   │
│  │  │  Memory  │ │ SQLite (header_rules.db)   │  │   │
│  │  └──────────┘ └────────────────────────────┘  │   │
│  └───────────────────────────────────────────────┘   │
├──────────────────────────────────────────────────────┤
│                  SQLMap 引擎层                        │
│  ┌──────────────────────────────────────────────┐   │
│  │      third_lib/sqlmap (Git Submodule)        │   │
│  └──────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────┘

1.2 数据流

用户操作 → Vue组件 → Pinia Store → API请求 → FastAPI路由
    → Service层 → DataStore/Model → SQLMap引擎 → 结果返回
    → WebSocket推送 → Pinia Store更新 → Vue组件响应

1.3 关键设计决策

决策 方案 原因
前端框架 Vue 3 + Composition API 更好的 TypeScript 支持,组件逻辑复用
状态管理 Pinia Vue 3 官方推荐,模块化设计
UI 组件库 PrimeVue 4 企业级组件,暗色主题支持
后端框架 FastAPI 原生异步支持,自动 OpenAPI 文档
包管理 (Python) uv 比 pip 快 10-100 倍,依赖锁定
任务存储 内存 (DataStore) 低延迟,简单可靠
规则存储 SQLite 持久化,支持复杂查询

2. 线程安全与并发模型

2.1 核心问题

后端使用 FastAPI (异步框架),但 DataStore 使用 threading.Lock(同步锁)。直接在 async 函数中使用同步锁会阻塞事件循环。

2.2 解决方案

使用 run_in_executor 将同步操作移至线程池:

import asyncio
from concurrent.futures import ThreadPoolExecutor

# 错误做法(会阻塞事件循环)
async def bad_example():
    with DataStore.tasks_lock:
        tasks = list(DataStore.tasks.values())
    return tasks

# 正确做法(在线程池中执行)
_executor = ThreadPoolExecutor(max_workers=4)

async def good_example():
    loop = asyncio.get_event_loop()
    tasks = await loop.run_in_executor(
        _executor,
        lambda: _get_tasks_sync()
    )
    return tasks

def _get_tasks_sync():
    """在线程池中执行,可以安全使用同步锁"""
    with DataStore.tasks_lock:
        return list(DataStore.tasks.values())

2.3 并发限制

# config.py
MAX_TASKS_COUNT = 3
MAX_TASKS_COUNT_LOCK = threading.Lock()

最多同时运行 3 个扫描任务,通过 MAX_TASKS_COUNT_LOCK 控制。

2.4 关键锁列表

锁名称 位置 保护对象
DataStore.tasks_lock model/DataStore.py 任务字典
MAX_TASKS_COUNT_LOCK config.py 并发任务计数
SessionBodyFieldManager._lock utils/session_body_field_manager.py 会话 Body 字段
SessionHeaderManager._lock utils/session_header_manager.py 会话 Header

3. WebSocket 实时通信

3.1 架构

┌──────────┐     WebSocket      ┌──────────────┐
│  前端     │◄──────────────────►│  WebSocket    │
│  Vue组件  │    ws://host:8775  │   Manager     │
└──────────┘                    │               │
                                │  ┌─────────┐ │
                                │  │ 轮询定时器│ │
                                │  └────┬────┘ │
                                │       │检查    │
                                │  ┌────┴────┐ │
                                │  │DataStore │ │
                                │  └─────────┘ │
                                └──────────────┘

3.2 核心模块

utils/websocket_manager.py:

  • 管理所有 WebSocket 连接
  • 定时轮询 DataStore 检测状态变更
  • 状态变更时向所有客户端推送通知
  • 支持配置轮询间隔(通过 /api/commonApi/config/refresh-interval

3.3 消息格式

{
  "type": "task_status_changed",
  "data": {
    "taskid": "abc123",
    "old_status": "Running",
    "new_status": "Completed"
  },
  "timestamp": "2026-07-18T10:30:00Z"
}

3.4 生命周期

# app.py - FastAPI 生命周期
@asynccontextmanager
async def lifespan(app: FastAPI):
    # 启动:初始化 WebSocket 管理器
    ws_manager.start(refresh_interval)
    yield
    # 关闭:停止 WebSocket 管理器
    await ws_manager.stop()

4. SQLMap 集成原理

4.1 集成方式

项目通过 Python 直接调用 SQLMap API(非命令行子进程):

# Task.py 中的关键集成点
from third_lib.sqlmap.lib.core.data import logger
from third_lib.sqlmap.lib.core.common import saveConfig
from third_lib.sqlmap.lib.core.optiondict import optDict

4.2 扫描流程

1. 创建任务 (Task.__init__)
   ├── 生成临时请求文件(HTTP 原始格式)
   ├── 配置 SQLMap 选项 (optDict)
   └── 设置任务状态: New

2. 启动扫描
   ├── 应用 Header 规则 (header_processor)
   ├── 应用 Body 字段规则 (body_field_processor)
   ├── 应用作用域匹配 (scope_matcher)
   ├── 启动 SQLMap 子进程
   └── 设置任务状态: Running

3. 监控扫描
   ├── task_monitor 定时检查进程状态
   ├── 收集 stdout/stderr (StdDbOut)
   ├── 解析扫描结果
   └── WebSocket 推送状态更新

4. 完成扫描
   ├── 设置任务状态: Completed/Failed/Terminated
   ├── 保存扫描结果到 DataStore
   └── WebSocket 推送完成通知

4.3 请求文件处理

-r 参数不通过命令行传递,而是由后端生成临时请求文件:

# Task.py - HTTP 请求临时文件
_DEFAULT_TEMP_DIR = os.path.join(os.getcwd(), "temp", "http_requests")

# 关键处理:
# 1. 去除 Content-Length(让 SQLMap 自动计算)
# 2. 二进制模式写入(避免 Windows 换行符转换)
# 3. 规范化换行符为标准 HTTP 格式
# 4. 清理尾部空行(避免 GET 误判为 POST)

4.4 参数限制

SQLMap RESTAPI 限制的参数(在 Burp 插件中置灰):

  • --sql-shell: 交互式 SQL shell
  • --wizard: 向导模式

安全警告参数(UI 显示警告标识):

  • 严重 (红色): osCmd, osPwn, osSmb, osBof, regRead, regAdd, regDel
  • 高危 (橙色): osShell, privEsc
  • 中危 (橙色): fileRead, fileWrite, fileDest

5. 请求解析器架构

5.1 多格式解析

utils/header_parser.py 支持自动检测和解析多种 HTTP 请求格式:

格式 识别特征 解析器
cURL (Bash) curl + 单引号 _parse_curl_bash()
cURL (CMD) curl + 双引号, ^ 转义符 _parse_curl_cmd()
PowerShell Invoke-WebRequest _parse_powershell()
fetch fetch( _parse_fetch()
Raw HTTP METHOD /path HTTP/1.1 _parse_raw_http()

5.2 解析流程

输入字符串
  → 格式检测 (detect_format)
  → 格式特定解析
  → 统一 HTTP 报文对象
  {
    method: "POST",
    url: "http://...",
    headers: {...},
    body: "..."
  }
  → 生成任务请求文件

5.3 关键处理

  • cURL (CMD) 中文字符前的 ^ 转义符移除
  • fetch 格式中的转义引号处理
  • URL 解析时 host 排除端口
  • 非默认端口保留在 Host header 中

6. Burp 插件双 API 架构

6.1 架构设计

两个 API 版本共享相同的分层结构:

src/burpEx/
├── montoya-api/src/main/java/com/sqlmapwebui/burp/
│   ├── api/          # API 客户端
│   ├── config/       # 配置管理
│   ├── core/         # 扩展入口点
│   ├── model/        # 数据模型
│   ├── service/      # 业务服务
│   ├── ui/           # 用户界面
│   │   ├── component/  # 可复用组件
│   │   ├── dialog/     # 对话框
│   │   ├── panel/      # 配置面板
│   │   └── tab/        # 主标签页
│   └── util/         # 工具类
└── legacy-api/       # 结构相同

6.2 关键差异

特性 Montoya API Legacy API
Java 版本 17+ 11+
Burp 版本 2023.1+ 任意版本
HTTP 处理 Montoya HttpRequestResponse IHttpRequestResponse
UI 框架 Swing (Montoya API) Swing (Legacy API)
事件模型 Montoya Event System IBurpExtenderCallbacks

6.3 文件同步

使用同步脚本保持两个版本的公共代码一致:

# 同步公共代码(如命令构建器、参数映射)
# 通过脚本从 montoya-api 同步到 legacy-api

7. 前端性能优化

7.1 智能轮询

// stores/task.ts
const POLLING_STRATEGY = {
  active: 5000,    // 有运行中任务:5秒轮询
  idle: 30000,     // 无运行中任务:30秒轮询
  hidden: 60000,   // 页面隐藏:60秒轮询
  paused: 0,       // 暂停轮询
}

7.2 构建优化

// vite.config.ts
build: {
  rollupOptions: {
    output: {
      manualChunks: {
        vendor: ['vue', 'vue-router', 'pinia'],
        primevue: ['primevue'],
        utils: ['axios', 'dayjs'],
      }
    }
  }
}

代码分割策略:

  • vendor: Vue 核心库
  • primevue: PrimeVue 组件库
  • utils: 工具库

7.3 响应式优化

  • 使用 computed 代替模板内复杂表达式
  • 大列表使用分页加载
  • 过滤防抖 300ms
  • 任务列表使用虚拟滚动(大数量时)

8. 构建与发布

8.1 CI/CD 流程

GitHub Actions 触发条件:

  • 推送 tag: release-v*, v*-release*, release/v*

构建产物:

  • sqlmapwebui-{version}.zip - 后端 + 集成前端
  • sqlmap-webui-burp-montoya-{version}.jar - Burp Montoya 插件
  • sqlmap-webui-burp-legacy-{version}.jar - Burp Legacy 插件
  • vulnTestServer-{version}.zip - VulnShop 靶场

8.2 版本号管理

# src/backEnd/config.py
VERSION = "1.8.57"

版本号一致性检查点:

  • config.py → 后端版本
  • package.json → 前端版本
  • pom.xml (x2) → Burp 插件版本
  • CHANGELOG.md / CHANGELOG_EN.md → 变更日志

8.3 发布检查清单

  1. 更新 config.py 中的 VERSION
  2. 更新 package.json 中的 version
  3. 更新两个 pom.xml 中的版本号
  4. 更新 CHANGELOG.md 和 CHANGELOG_EN.md
  5. 更新 README.md 的版本徽章和最新版本说明
  6. 运行 pnpm run build 验证前端构建
  7. 运行 python -m pytest 验证后端测试
  8. 提交并推送 tag

上一篇: 核心功能开发与调试技巧 | 返回: 开发维护指南首页