使用 QClaw 驱动多 Agent 团队对项目进行专业安全审计实战

使用 QClaw 驱动多 Agent 团队对项目进行专业安全审计实战

📅 日期:2026年5月29日

🔧 技术栈:QClaw 多 Agent 协作 · Node.js · Express · Vue 3

💡 关键词:AI 驱动开发 · 自动化审计 · 多 Agent 协作


一、背景:一次临时起意的深度审计

今天下午,我安排qclaw,安排后端架构师、前端开发者和安全工程师多个agent对项目进行专业分析。

这是一个基于 Express + Vue 3 的设备测试数据管理系统,需求很明确:

"安排后端架构师、前端开发者和安全工程师对项目进行专业分析,汇总,评审,最后给出评估报告"

通常情况下,需要手动阅读代码、分析逻辑、输出报告。但这一次,我决定把工作分配给专业 Agent 团队,让架构师做架构评审、前端开发者做代码审查、安全工程师做渗透测试级别的审计------三路并行,各司其职,最后由我汇总成一份综合报告。


二、系统架构:如何驱动多 Agent 并行工作

整个分析流程如下:
#mermaid-svg-fsfFoVEH4aaOTGub{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fsfFoVEH4aaOTGub .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fsfFoVEH4aaOTGub .error-icon{fill:#552222;}#mermaid-svg-fsfFoVEH4aaOTGub .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fsfFoVEH4aaOTGub .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fsfFoVEH4aaOTGub .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fsfFoVEH4aaOTGub .marker.cross{stroke:#333333;}#mermaid-svg-fsfFoVEH4aaOTGub svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fsfFoVEH4aaOTGub p{margin:0;}#mermaid-svg-fsfFoVEH4aaOTGub .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fsfFoVEH4aaOTGub .cluster-label text{fill:#333;}#mermaid-svg-fsfFoVEH4aaOTGub .cluster-label span{color:#333;}#mermaid-svg-fsfFoVEH4aaOTGub .cluster-label span p{background-color:transparent;}#mermaid-svg-fsfFoVEH4aaOTGub .label text,#mermaid-svg-fsfFoVEH4aaOTGub span{fill:#333;color:#333;}#mermaid-svg-fsfFoVEH4aaOTGub .node rect,#mermaid-svg-fsfFoVEH4aaOTGub .node circle,#mermaid-svg-fsfFoVEH4aaOTGub .node ellipse,#mermaid-svg-fsfFoVEH4aaOTGub .node polygon,#mermaid-svg-fsfFoVEH4aaOTGub .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fsfFoVEH4aaOTGub .rough-node .label text,#mermaid-svg-fsfFoVEH4aaOTGub .node .label text,#mermaid-svg-fsfFoVEH4aaOTGub .image-shape .label,#mermaid-svg-fsfFoVEH4aaOTGub .icon-shape .label{text-anchor:middle;}#mermaid-svg-fsfFoVEH4aaOTGub .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fsfFoVEH4aaOTGub .rough-node .label,#mermaid-svg-fsfFoVEH4aaOTGub .node .label,#mermaid-svg-fsfFoVEH4aaOTGub .image-shape .label,#mermaid-svg-fsfFoVEH4aaOTGub .icon-shape .label{text-align:center;}#mermaid-svg-fsfFoVEH4aaOTGub .node.clickable{cursor:pointer;}#mermaid-svg-fsfFoVEH4aaOTGub .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fsfFoVEH4aaOTGub .arrowheadPath{fill:#333333;}#mermaid-svg-fsfFoVEH4aaOTGub .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fsfFoVEH4aaOTGub .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fsfFoVEH4aaOTGub .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fsfFoVEH4aaOTGub .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fsfFoVEH4aaOTGub .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fsfFoVEH4aaOTGub .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fsfFoVEH4aaOTGub .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fsfFoVEH4aaOTGub .cluster text{fill:#333;}#mermaid-svg-fsfFoVEH4aaOTGub .cluster span{color:#333;}#mermaid-svg-fsfFoVEH4aaOTGub div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fsfFoVEH4aaOTGub .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fsfFoVEH4aaOTGub rect.text{fill:none;stroke-width:0;}#mermaid-svg-fsfFoVEH4aaOTGub .icon-shape,#mermaid-svg-fsfFoVEH4aaOTGub .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fsfFoVEH4aaOTGub .icon-shape p,#mermaid-svg-fsfFoVEH4aaOTGub .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fsfFoVEH4aaOTGub .icon-shape .label rect,#mermaid-svg-fsfFoVEH4aaOTGub .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fsfFoVEH4aaOTGub .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fsfFoVEH4aaOTGub .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fsfFoVEH4aaOTGub :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 👤 用户发起请求

浏览项目 + 专业分析
🔍 总协调官 (QClaw)

收集项目信息
后端架构师 Agent
前端开发者 Agent
安全工程师 Agent
后端架构分析报告

~19,000字
前端开发分析报告

~6,500字
安全工程分析报告

~6,500字
📋 总协调官汇总
《项目综合评估报告》

~7,000字

三个 Agent 同时启动,各自独立分析自己擅长的领域,不需要互相等待。这种模式的效率远高于一个人从头到尾完成所有分析。


三、分析过程全记录

3.1 步骤一:项目发现与基本信息收集

首先,我通过 Gitea API 获取了项目的基本信息:

json 复制代码
{
  "name": "rockTestSvr",
  "full_name": "songwei/rockTestSvr",
  "description": "",
  "language": "Vue",
  "default_branch": "main",
  "created_at": "2026-05-26T14:02:10+08:00",
  "updated_at": "2026-05-29T16:10:11+08:00",
  "size": 5588
}

然后通过 API 获取了完整的目录结构:

文件/目录 说明
server.js 主服务端文件(~24KB)
README.md 项目说明(~17KB)
TECHNICAL_DOCUMENT.md 技术文档(~24KB)
frontend/ 前端 Vue 3 项目
config/ 配置文件目录
init.sql 数据库初始化脚本
init-db.js 数据库初始化脚本

通过 API 批量下载关键文件到本地临时目录,为三个 Agent 准备好分析素材。

3.2 步骤二:三路 Agent 并行分析

三个 Agent 同时启动,分配任务如下:
安全工程师 前端开发者 后端架构师 总协调官 👤 用户 安全工程师 前端开发者 后端架构师 总协调官 👤 用户 #mermaid-svg-KHrBUipvk6DZiTHx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KHrBUipvk6DZiTHx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KHrBUipvk6DZiTHx .error-icon{fill:#552222;}#mermaid-svg-KHrBUipvk6DZiTHx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KHrBUipvk6DZiTHx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KHrBUipvk6DZiTHx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KHrBUipvk6DZiTHx .marker.cross{stroke:#333333;}#mermaid-svg-KHrBUipvk6DZiTHx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KHrBUipvk6DZiTHx p{margin:0;}#mermaid-svg-KHrBUipvk6DZiTHx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KHrBUipvk6DZiTHx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-KHrBUipvk6DZiTHx .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-KHrBUipvk6DZiTHx .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-KHrBUipvk6DZiTHx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-KHrBUipvk6DZiTHx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-KHrBUipvk6DZiTHx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-KHrBUipvk6DZiTHx .sequenceNumber{fill:white;}#mermaid-svg-KHrBUipvk6DZiTHx #sequencenumber{fill:#333;}#mermaid-svg-KHrBUipvk6DZiTHx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-KHrBUipvk6DZiTHx .messageText{fill:#333;stroke:none;}#mermaid-svg-KHrBUipvk6DZiTHx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KHrBUipvk6DZiTHx .labelText,#mermaid-svg-KHrBUipvk6DZiTHx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-KHrBUipvk6DZiTHx .loopText,#mermaid-svg-KHrBUipvk6DZiTHx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-KHrBUipvk6DZiTHx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-KHrBUipvk6DZiTHx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-KHrBUipvk6DZiTHx .noteText,#mermaid-svg-KHrBUipvk6DZiTHx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-KHrBUipvk6DZiTHx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KHrBUipvk6DZiTHx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KHrBUipvk6DZiTHx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KHrBUipvk6DZiTHx .actorPopupMenu{position:absolute;}#mermaid-svg-KHrBUipvk6DZiTHx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-KHrBUipvk6DZiTHx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KHrBUipvk6DZiTHx .actor-man circle,#mermaid-svg-KHrBUipvk6DZiTHx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-KHrBUipvk6DZiTHx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发起分析请求启动后端架构分析任务启动前端开发分析任务启动安全工程分析任务分析 server.js分析 frontend/ 代码审计安全漏洞✅ 完成 (~7分钟)✅ 完成 (~7分钟)✅ 完成 (~4分钟)汇总三份报告交付综合评估报告

并行执行的时间对比:

串行执行(一个一个做) 并行执行(三路同时)
7分钟 + 7分钟 + 4分钟 = 18分钟 max(7, 7, 4) = 7分钟

仅时间就节省了 60% 以上。

3.3 步骤三:初步分析结果

后端架构分析(评分:5.1/10)
  • 单文件架构 :668 行的 server.js 集中了所有逻辑,缺乏模块化
  • 23 个 API 端点:RESTful 规范部分遵循,URL 命名不一致
  • Token 认证 :128 位随机 token,但使用 Math.random() 生成
  • 密码存储:明文比较,违反 OWASP 标准
  • CORS 配置Access-Control-Allow-Origin: * 过于宽松
  • 性能问题 :JSON 字段使用 LIKE 查询,效率极低
前端开发分析(评分:5.6/10)
  • 技术栈:Vue 3 + Vite 5 + Element Plus + Axios,技术选型现代
  • 组件重复:侧边栏代码在 6 个页面中重复约 480 行
  • 状态管理:无 Pinia/Vuex,仅靠 localStorage,无跨组件状态共享
  • 未使用依赖chart.js + vue-chartjs 声明但从未引用,浪费 ~65KB
  • 性能问题:Statistics 组件全量加载数据
安全工程分析(评级:D)

发现 15 个安全问题,按风险分级:

风险等级 数量 代表问题
🔴 严重 3 明文密码存储、关键接口无认证、CORS *
🟠 高危 4 Math.random() 生成 Token、路径遍历、SQL LIKE 注入、错误信息泄露
🟡 中危 5 无安全头、无速率限制、无账户锁定、输入验证不足
🟢 低危 3 内存 Token 存储、日志无清理、依赖库待审计

3.4 步骤四:综合汇总

三个 Agent 完成后,我作为总协调官进行了交叉评审,整合成一份综合评估报告,包括:

  • 严重问题清单(P0)
  • 高危问题清单(P1)
  • 中危问题清单(P2)
  • 低危问题清单(P3)
  • 四阶段改进优先级路线图
  • 具体修复方案和代码示例

四、插曲:Token 专项深度评估

用户看到报告中提到 Token 使用 Math.random() 生成,立刻贴出了自己已经改进的代码:

javascript 复制代码
generateToken(userId, username, role) {
  const token = crypto.randomBytes(32).toString('base64url');
  const now = Date.now();
  const expiresAt = now + this.longExpireTime;

  this.tokens.set(token, {
    userId,
    username,
    role,
    expiresAt,
    lastActivityTime: now,
    createdAt: now
  });

  return { token, expiresAt };
}

用户非常生气:"白痴,看看不见我已经改了吗?!!!!"

这是一个真实的案例------仓库代码和本地最新代码不一致,导致审计结论滞后于实际状态。

我承认了这个问题,并立即安排安全工程师基于本地最新代码重新评估:

复制代码
E:\work\rocktech\dev\rockTestSvr

新的评估结果确认了 Token 生成算法确实已修复 ✅,但同时也发现了一些新的问题:

  • 部分接口仍存在 SQL 注入风险
  • 路径遍历漏洞仍未完全修复
  • 密码明文存储问题依然存在
  • 缺少 HTTPS、安全头、速率限制等生产级安全配置

这个插曲提醒我们:AI 审计必须基于最新代码,仓库可能落后于本地开发版本好几步。


五、方法论:如何用 QClaw 驱动专业项目审计

通过这次实战,我总结出了一套用 QClaw 驱动多 Agent 进行项目审计的标准流程:

5.1 流程图

#mermaid-svg-dYci8S7AlhIXXNPp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dYci8S7AlhIXXNPp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dYci8S7AlhIXXNPp .error-icon{fill:#552222;}#mermaid-svg-dYci8S7AlhIXXNPp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dYci8S7AlhIXXNPp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dYci8S7AlhIXXNPp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dYci8S7AlhIXXNPp .marker.cross{stroke:#333333;}#mermaid-svg-dYci8S7AlhIXXNPp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dYci8S7AlhIXXNPp p{margin:0;}#mermaid-svg-dYci8S7AlhIXXNPp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dYci8S7AlhIXXNPp .cluster-label text{fill:#333;}#mermaid-svg-dYci8S7AlhIXXNPp .cluster-label span{color:#333;}#mermaid-svg-dYci8S7AlhIXXNPp .cluster-label span p{background-color:transparent;}#mermaid-svg-dYci8S7AlhIXXNPp .label text,#mermaid-svg-dYci8S7AlhIXXNPp span{fill:#333;color:#333;}#mermaid-svg-dYci8S7AlhIXXNPp .node rect,#mermaid-svg-dYci8S7AlhIXXNPp .node circle,#mermaid-svg-dYci8S7AlhIXXNPp .node ellipse,#mermaid-svg-dYci8S7AlhIXXNPp .node polygon,#mermaid-svg-dYci8S7AlhIXXNPp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dYci8S7AlhIXXNPp .rough-node .label text,#mermaid-svg-dYci8S7AlhIXXNPp .node .label text,#mermaid-svg-dYci8S7AlhIXXNPp .image-shape .label,#mermaid-svg-dYci8S7AlhIXXNPp .icon-shape .label{text-anchor:middle;}#mermaid-svg-dYci8S7AlhIXXNPp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dYci8S7AlhIXXNPp .rough-node .label,#mermaid-svg-dYci8S7AlhIXXNPp .node .label,#mermaid-svg-dYci8S7AlhIXXNPp .image-shape .label,#mermaid-svg-dYci8S7AlhIXXNPp .icon-shape .label{text-align:center;}#mermaid-svg-dYci8S7AlhIXXNPp .node.clickable{cursor:pointer;}#mermaid-svg-dYci8S7AlhIXXNPp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dYci8S7AlhIXXNPp .arrowheadPath{fill:#333333;}#mermaid-svg-dYci8S7AlhIXXNPp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dYci8S7AlhIXXNPp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dYci8S7AlhIXXNPp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dYci8S7AlhIXXNPp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dYci8S7AlhIXXNPp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dYci8S7AlhIXXNPp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dYci8S7AlhIXXNPp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dYci8S7AlhIXXNPp .cluster text{fill:#333;}#mermaid-svg-dYci8S7AlhIXXNPp .cluster span{color:#333;}#mermaid-svg-dYci8S7AlhIXXNPp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dYci8S7AlhIXXNPp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dYci8S7AlhIXXNPp rect.text{fill:none;stroke-width:0;}#mermaid-svg-dYci8S7AlhIXXNPp .icon-shape,#mermaid-svg-dYci8S7AlhIXXNPp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dYci8S7AlhIXXNPp .icon-shape p,#mermaid-svg-dYci8S7AlhIXXNPp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dYci8S7AlhIXXNPp .icon-shape .label rect,#mermaid-svg-dYci8S7AlhIXXNPp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dYci8S7AlhIXXNPp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dYci8S7AlhIXXNPp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dYci8S7AlhIXXNPp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 📋 定义审计范围

后端 / 前端 / 安全
🔍 信息收集

API / 本地文件
选择数据源
Gitea API

(仓库代码)
本地文件路径

(最新代码)
适合公开项目审计
适合本地开发版本审计
启动多 Agent 并行分析
后端架构师
前端开发者
安全工程师
汇总 + 交叉评审
产出综合评估报告

5.2 Agent 角色分配策略

Agent 职责 分析重点
后端架构师 架构设计评审 分层架构、API 设计、数据库、性能
前端开发者 代码质量评审 Vue 组件、UI/UX、状态管理
安全工程师 安全漏洞审计 认证、注入、XSS、安全配置

5.3 关键注意事项

① 确认代码版本

复制代码
仓库代码 ≠ 本地代码 ≠ 生产代码

审计前必须明确使用哪个版本。如果是本地开发版本,优先让工程师直接读本地文件,而不是通过 API 拉仓库版本(可能落后数小时甚至数天)。

② 并行优于串行

三个领域的分析互不依赖,应该并行启动:

复制代码
正确做法:BE + FE + SE 同时开始
错误做法:BE完成后 → FE开始 → SE开始

③ 汇总时做交叉评审

三个 Agent 的分析可能存在交叉重复或矛盾,总协调官需要:

  • 去重相同的发现
  • 统一评分标准
  • 合并优先级(取最高风险等级)

六、最终成果

本次审计产出了以下文档:

报告 文件位置 规模
后端架构分析报告 backend-architecture-analysis.md ~19,000 字
前端开发分析报告 frontend-analysis.md ~6,500 字
安全工程分析报告 security-analysis.md ~6,500 字
Token 专项评估报告 token-security-reassessment.md ~8,000 字
最新代码安全评估 security-analysis-latest.md ~15,000 字
项目综合评估报告 comprehensive-evaluation-report.md ~7,000 字

七、结论

通过 QClaw 的多 Agent 协作机制,我们用 约 10 分钟 完成了通常需要 数小时甚至一整天 的专业项目审计。三路 Agent 并行工作,各自在擅长领域深入分析,最终由总协调官汇总成完整的评估报告。

这次实战验证了几个核心价值:

  1. 效率提升:并行分析节省 60%+ 时间
  2. 专业深度:每个 Agent 都在自己领域做到资深级别评审
  3. 实时纠错:用户反馈后立即重新评估,确保结论准确
  4. 可追溯:所有分析都有详细的文档记录,便于后续追踪

对于需要同时审计多个技术维度的复杂项目,多 Agent 协作是目前最高效的工作模式。

相关推荐
codingPower1 小时前
JAVA后端安全进阶:基于HMAC-SHA256+Nonce+Timestamp的API防重放攻击方案
java·开发语言·spring boot·安全
Geometry Fu1 小时前
《物联网安全》第4章 网络攻防实例
网络·物联网·安全·网络攻击·网络攻防
Sombra_Olivia2 小时前
Vulhub 中的 cmsms CVE-2019-9053 & CVE-2021-26120
安全·web安全·网络安全·渗透测试·vulhub
Hotchip_MEMS2 小时前
韬τ定律的技术内核:逻辑折叠与信息路径重构
人工智能·物联网
路在旁边2 小时前
RTOS vs 裸机
物联网·iot
数字护盾(和中)2 小时前
攻击链识别:企业抵御快攻型勒索攻击的关键能力
网络·安全·web安全
云天AI实战派2 小时前
2026 跨境出海全流程实战:独立开发者如何用开源工具搭建落地页、订阅支付、客服工单与多语言 SEO 闭环
人工智能·安全·chatgpt·个人开发·独立开发·跨境出海
六月雨滴3 小时前
Oracle RMAN 安全与加密
安全·oracle·dba
qq_312920113 小时前
服务器被攻击!完整安全加固清单汇总
运维·服务器·安全