个人博客 3:漏洞检测结果展示优化
·
一、开发任务
我在团队中主要负责渐进式上下文补全、大模型调用、漏洞解释生成、修复建议输出,是连接后端规则分析与前端插件展示的核心环节。AI 模块的稳定性、准确率和响应速度,将直接决定项目最终能否达到可演示、可考核、可验收的标准。
本次开发核心任务:漏洞检测结果展示优化,检出漏洞后新增展示漏洞类型 + 简介 + 修改方法,满足课堂演示需求,帮助初学者快速理解漏洞问题、风险及修复方案。
二、需求目标
- 升级漏洞检测结果展示逻辑,不再仅展示「是否有风险」;
- 检测出漏洞后,自动展示漏洞类型、简短漏洞介绍、修改方法三类核心信息;
- 降低初学者理解成本,明确告知「问题是什么、为什么危险、怎么改」。
三、开发范围与文件改动
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目录,执行编译命令:
npm run compile
执行后自动更新extension.js和extension.js.map文件。
2. 功能验证
- 准备包含已知漏洞(如 SQL 注入)的测试代码;
- 运行插件执行代码分析;
- 验证两项核心效果:
- 通知弹窗正常显示「首个漏洞:类型 + 简介 + 修改方法」;
- 输出面板每条漏洞均附带「简介 / 修改方法」信息,格式正确、内容完整。
六、开发总结
- 本次开发不影响原有接口、不破坏现有功能,兼容新旧后端响应;
- 完成了漏洞检测结果的信息升级,补充了漏洞简介和修改方法,大幅提升了插件的教学实用性;
- 新增工具函数模块化设计,逻辑清晰,便于后续维护和扩展其他漏洞类型的展示逻辑;
- 验证通过,功能正常运行,满足课堂演示和初学者使用需求。
- 返回的修改建议还有一点语言问题,明天看看改一下再传git。不出意外下次更新应该是跨文件上下文补全,最近再看看怎么做。
顺便提醒一下git里面最新版不在主分支,pull下来改的时候记得切换分支,要不合起来比较麻烦。
更多推荐

所有评论(0)