一、核心定位

本次开发中,前面两位同学已经完成了最小闭环,可以在漏洞检测vscode插件的基础上进行后续开发,已经可以进行渐进式上下文补全、漏洞解释生成、修复建议输出等关键工作。该模块作为连接后端规则分析与前端插件展示的核心环节,直接决定项目最终能否达到可演示、可考核、可验收的标准。

当前核心任务:优化漏洞检测结果展示逻辑,在检出漏洞后新增漏洞类型、漏洞简介、修改方法三类核心信息,解决原有展示仅告知「是否有风险」的局限,适配课堂演示场景,降低初学者理解成本。

二、团队开发需求目标

结合教学场景与用户需求,团队明确本次开发核心目标,确保功能落地贴合实际使用场景:

  1. 升级漏洞检测结果展示逻辑,打破原有仅展示「是否有风险」的单一模式,丰富展示维度;

  2. 检测出漏洞后,自动展示漏洞类型、简短漏洞介绍、修改方法三类核心信息,形成完整的风险告知闭环;

  3. 聚焦初学者使用体验,明确告知用户「问题是什么、为什么危险、怎么改」,降低理解门槛。

三、开发范围与文件改动

1. 核心改动文件

本次开发聚焦前端展示逻辑优化,核心改动文件及作用如下,团队成员可参考同步:

文件路径

改动类型

核心作用

vscode-extension/src/extension.ts

功能增强

新增风险详情格式化逻辑,实现通知弹窗、输出面板的漏洞类型/简介/修改方法展示

vscode-extension/out/extension.js

编译产物更新

TypeScript 编译后的运行文件,与源码同步,支撑扩展实际功能

vscode-extension/out/extension.js.map

调试文件更新

源码映射文件,方便调试定位 TypeScript 源码问题

2. 无破坏性变更说明(团队重点关注)

为保障项目稳定性,本次开发严格遵循无破坏性变更原则,团队同步如下:

  • 后端接口无任何修改,沿用原有AnalyzeResponse.risks[]字段,无需后端团队配合调整;

  • 插件兼容后端旧响应,当无新增字段时,自动展示前端兜底内容,不影响原有功能正常使用,降低版本兼容风险。

四、核心功能实现

1. 前端展示效果

本次优化重点提升前端展示的实用性,结合课堂演示场景,优化后核心展示效果如下:

(1)通知弹窗(showInformationMessage)

保留原有「检测摘要 + 风险等级 + 耗时」基础信息,确保核心检测数据不缺失;存在漏洞时,追加首条漏洞完整信息,格式为:首个漏洞:<类型>;简介:<简述>;修改方法:<建议>,方便用户快速获取关键漏洞信息。

(2)输出面板(Output Channel)

保留原有「漏洞位置 / 类型 / 严重程度」展示逻辑,保证用户使用习惯连贯性;每条漏洞新增一行详情,格式为:简介:...|修改方法:...;多条漏洞逐条展示,支持用户逐项排查,提升漏洞处理效率。

2. 核心代码实现(extension.ts)

为支撑漏洞信息格式化与展示功能,团队新增5个核心工具函数,实现逻辑模块化设计,便于后续维护与扩展,具体实现如下(团队成员可参考学习):

① formatRiskDetailZh():拼接单条漏洞的简介 + 修改方法,统一输出格式,确保展示规范统一;

function formatRiskDetailZh(risk: Record<string, unknown>): string {
  const intro = buildRiskIntroZh(risk);
  const fix = buildRiskFixZh(risk);
  return `     简介:${intro}|修改方法:${fix}`;
}

② formatFirstRiskBriefZh():生成通知弹窗中首条漏洞的摘要信息,聚焦核心信息展示;

function formatFirstRiskBriefZh(risk: Record<string, unknown>): string {
  const type = riskTypeZh(String(risk.type ?? ""));
  const intro = buildRiskIntroZh(risk);
  const fix = buildRiskFixZh(risk);
  return `首个漏洞:${type};简介:${intro};修改方法:${fix}`;
}

③ buildRiskIntroZh():生成漏洞简短介绍,针对SQLInjection提供固定中文介绍,提升针对性与易懂性;

function buildRiskIntroZh(risk: Record<string, unknown>): string {
  const rawType = String(risk.type ?? "");
  if (rawType === "SQLInjection") {
    return "外部输入被直接拼接到 SQL 语句中,攻击者可能构造输入绕过校验或读取/篡改数据。";
  }
  const reason = normalizeTextField(risk.reason);
  return reason || "该位置存在潜在安全风险,请结合上下文进一步确认。";
}

④ buildRiskFixZh():按优先级生成修改方法,兼容后端返回值与前端兜底,确保修改建议的实用性与完整性;

function buildRiskFixZh(risk: Record<string, unknown>): string {
  const best = normalizeTextField(risk.fix_best);
  if (best) {
    return best;
  }
  const minimal = normalizeTextField(risk.fix_minimal);
  if (minimal) {
    return minimal;
  }
  const rawType = String(risk.type ?? "");
  if (rawType === "SQLInjection") {
    return "改为参数化查询,不要通过字符串拼接构造 SQL;同时对输入做白名单校验。";
  }
  return "优先采用安全 API,避免把外部输入直接拼接到执行语句。";
}

⑤ normalizeTextField():统一处理后端可选字符串字段,过滤空白内容,保证展示整洁,提升用户体验。

function normalizeTextField(v: unknown): string {
  return typeof v === "string" ? v.trim() : "";
}

3. 字段优先级策略

为确保漏洞信息展示的准确性与实用性,团队明确以下字段优先级策略,后续扩展需遵循该规则:

  1. 修改方法优先级:后端fix_best(最优方案) > 后端fix_minimal(最小修改方案) > 前端内置默认建议;

  2. 漏洞简介优先级:SQLInjection固定中文模板 > 后端返回reason字段 > 前端通用兜底文案。

五、团队开发与验证步骤

为确保功能稳定落地,团队严格遵循「编译-验证-复盘」流程,具体步骤如下,供团队成员参考:

1. 编译打包

进入vscode-extension目录,执行以下编译命令,执行后将自动更新extension.js和extension.js.map文件,确保编译产物与源码同步:

npm run compile

2. 功能验证

团队共同制定验证方案,确保功能符合需求,验证步骤如下:

  • 准备包含已知漏洞(如 SQL 注入)的测试代码,覆盖核心场景;

  • 运行插件执行代码分析,模拟实际使用场景;

  • 重点验证两项核心效果:通知弹窗正常显示「首个漏洞:类型 + 简介 + 修改方法」;输出面板每条漏洞均附带「简介 / 修改方法」信息,格式正确、内容完整。

一些问题:虽然目前已经上传了git,但其中输出部分还有待改进。后续会继续更新输出修复方法的内容与上下文补全策略。顺便一说因为每次项目文档是跟着下一篇我个人文档一起发的,所以当前git问题已经解决,大家拉取主分支并编辑即可。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐