CodeGuard Tutor 进度更新:文件内上下文补全丨项目博客第四篇
一、核心定位
本次开发中,前面两位同学已经完成了最小闭环,可以在漏洞检测vscode插件的基础上进行后续开发,已经可以进行渐进式上下文补全、漏洞解释生成、修复建议输出等关键工作。该模块作为连接后端规则分析与前端插件展示的核心环节,直接决定项目最终能否达到可演示、可考核、可验收的标准。
当前核心任务:优化漏洞检测结果展示逻辑,在检出漏洞后新增漏洞类型、漏洞简介、修改方法三类核心信息,解决原有展示仅告知「是否有风险」的局限,适配课堂演示场景,降低初学者理解成本。
二、团队开发需求目标
结合教学场景与用户需求,团队明确本次开发核心目标,确保功能落地贴合实际使用场景:
-
升级漏洞检测结果展示逻辑,打破原有仅展示「是否有风险」的单一模式,丰富展示维度;
-
检测出漏洞后,自动展示漏洞类型、简短漏洞介绍、修改方法三类核心信息,形成完整的风险告知闭环;
-
聚焦初学者使用体验,明确告知用户「问题是什么、为什么危险、怎么改」,降低理解门槛。
三、开发范围与文件改动
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. 字段优先级策略
为确保漏洞信息展示的准确性与实用性,团队明确以下字段优先级策略,后续扩展需遵循该规则:
-
修改方法优先级:后端fix_best(最优方案) > 后端fix_minimal(最小修改方案) > 前端内置默认建议;
-
漏洞简介优先级:SQLInjection固定中文模板 > 后端返回reason字段 > 前端通用兜底文案。
五、团队开发与验证步骤
为确保功能稳定落地,团队严格遵循「编译-验证-复盘」流程,具体步骤如下,供团队成员参考:
1. 编译打包
进入vscode-extension目录,执行以下编译命令,执行后将自动更新extension.js和extension.js.map文件,确保编译产物与源码同步:
npm run compile
2. 功能验证
团队共同制定验证方案,确保功能符合需求,验证步骤如下:
-
准备包含已知漏洞(如 SQL 注入)的测试代码,覆盖核心场景;
-
运行插件执行代码分析,模拟实际使用场景;
-
重点验证两项核心效果:通知弹窗正常显示「首个漏洞:类型 + 简介 + 修改方法」;输出面板每条漏洞均附带「简介 / 修改方法」信息,格式正确、内容完整。
一些问题:虽然目前已经上传了git,但其中输出部分还有待改进。后续会继续更新输出修复方法的内容与上下文补全策略。顺便一说因为每次项目文档是跟着下一篇我个人文档一起发的,所以当前git问题已经解决,大家拉取主分支并编辑即可。
更多推荐

所有评论(0)