147 lines
8.5 KiB
Markdown
147 lines
8.5 KiB
Markdown
# 代码审查报告
|
||
|
||
**文件:** `data\demo-pmd\src\jsp\JspFix.jsp`
|
||
**语言:** html
|
||
**耗时:** 204.4s
|
||
**分析工具:** jsp
|
||
|
||
---
|
||
|
||
总计: 42 | 错误: 6 | 警告: 36 | 建议: 0
|
||
|
||
静态分析 · 38 个问题
|
||
|
||
- 🔴 `pmd:NoLongScripts` L8
|
||
第 8 行:避免在 JSP 文件中包含较长的脚本(如 JavaScript)。
|
||
建议: 将 JavaScript 移至外部文件,创建 js/demo.js 并放入两个函数,用 <script src="js/demo.js"></script> 替换整个内联 <script> 块。
|
||
- 🔴 `eslint:no-var` L10
|
||
第 10 行:不应使用 var,请改用 let 或 const。
|
||
建议: total 在循环中会被修改,建议改为 let total = 0;。
|
||
- 🔴 `eslint:no-var` L11
|
||
第 11 行:不应使用 var,请改用 let 或 const。
|
||
建议: 循环变量应使用块级作用域,建议改为 let i = 0;。
|
||
- 🔴 `eslint:no-unused-vars` L16
|
||
第 16 行:'doMore' 已定义但从未使用。
|
||
建议: 删除 doMore 函数;如果后续需要 doStuff,可保留 doStuff 并从外部调用。
|
||
- 🔴 `pmd:NoHtmlComments` L23
|
||
第 23 行:请使用 JSP 注释代替 HTML 注释。
|
||
建议: 将 HTML 注释 <!-- this is an html comment --> 改为 JSP 注释 <%-- this is an html comment --%>,避免注释内容发送到浏览器。
|
||
- 🟡 `pmd:JspEncoding` L1
|
||
第 1 行:JSP 文件应使用 UTF-8 编码。
|
||
建议: 在 page 指令中添加 pageEncoding="UTF-8",并将 contentType 设置为 text/html; charset=UTF-8。
|
||
- 🟡 `pmd:NoInlineScript` L8
|
||
第 8 行:不应内联 HTML 脚本内容。
|
||
建议: 不要在内联 <script> 中写脚本;将脚本抽取到外部 JS 文件后通过 src 引入,避免内联脚本并降低 CSP 风险。
|
||
- 🟡 `pmd:NoScriptlets` L26
|
||
第 26 行:避免在 JSP 文件中使用 scriptlet(Java 代码片段)。
|
||
建议: 将业务逻辑移入 Servlet/后端;若当前只需输出 1+2 的结果,可直接使用 EL 表达式 ${1 + 2} 替代整个 scriptlet。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L27
|
||
第 27 行:局部变量 'x' 可声明为 final。
|
||
建议: 变量 x 声明后未再赋值,改为 final int x = 1;。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L28
|
||
第 28 行:局部变量 'y' 可声明为 final。
|
||
建议: 变量 y 声明后未再赋值,改为 final int y = 2;。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L29
|
||
第 29 行:局部变量 'z' 可声明为 final。
|
||
建议: 变量 z 声明后未再赋值,改为 final int z = x + y;。
|
||
- 🟡 `pmd:NoJspForward` L33
|
||
第 33 行:不要从 JSP 文件内部执行转发。
|
||
建议: 将转发逻辑移到 Servlet 或 Filter 中,使用 request.getRequestDispatcher("other.jsp").forward(request, response);JSP 应只承担视图渲染。
|
||
- 🟡 `pmd:NoScriptlets` L35
|
||
第 35 行:避免在 JSP 文件中使用 scriptlet(Java 代码片段)。
|
||
建议: 该 scriptlet 中大量变量未被使用,仅依赖 xx + yy 的输出;应删除整个 scriptlet,直接用 EL 表达式 ${24 + 25} 输出结果。
|
||
- 🟡 `pmd:UnusedLocalVariable` L36
|
||
第 36 行:应避免未使用的局部变量 'a'。
|
||
建议: 删除未使用的局部变量 a。
|
||
- 🟡 `pmd:UnusedLocalVariable` L37
|
||
第 37 行:应避免未使用的局部变量 'b'。
|
||
建议: 删除未使用的局部变量 b。
|
||
- 🟡 `pmd:UnusedLocalVariable` L38
|
||
第 38 行:应避免未使用的局部变量 'c'。
|
||
建议: 删除未使用的局部变量 c。
|
||
- 🟡 `pmd:UnusedLocalVariable` L39
|
||
第 39 行:应避免未使用的局部变量 'd'。
|
||
建议: 删除未使用的局部变量 d。
|
||
- 🟡 `pmd:UnusedLocalVariable` L40
|
||
第 40 行:应避免未使用的局部变量 'e'。
|
||
建议: 删除未使用的局部变量 e。
|
||
- 🟡 `pmd:UnusedLocalVariable` L41
|
||
第 41 行:应避免未使用的局部变量 'f'。
|
||
建议: 删除未使用的局部变量 f。
|
||
- 🟡 `pmd:UnusedLocalVariable` L42
|
||
第 42 行:应避免未使用的局部变量 'g'。
|
||
建议: 删除未使用的局部变量 g。
|
||
- 🟡 `pmd:UnusedLocalVariable` L43
|
||
第 43 行:应避免未使用的局部变量 'h'。
|
||
建议: 删除未使用的局部变量 h。
|
||
- 🟡 `pmd:UnusedLocalVariable` L44
|
||
第 44 行:应避免未使用的局部变量 'i2'。
|
||
建议: 删除未使用的局部变量 i2。
|
||
- 🟡 `pmd:UnusedLocalVariable` L45
|
||
第 45 行:应避免未使用的局部变量 'j2'。
|
||
建议: 删除未使用的局部变量 j2。
|
||
- 🟡 `pmd:UnusedLocalVariable` L46
|
||
第 46 行:应避免未使用的局部变量 'k'。
|
||
建议: 删除未使用的局部变量 k。
|
||
- 🟡 `pmd:UnusedLocalVariable` L47
|
||
第 47 行:应避免未使用的局部变量 'l'。
|
||
建议: 删除未使用的局部变量 l。
|
||
- 🟡 `pmd:UnusedLocalVariable` L48
|
||
第 48 行:应避免未使用的局部变量 'm'。
|
||
建议: 删除未使用的局部变量 m。
|
||
- 🟡 `pmd:UnusedLocalVariable` L49
|
||
第 49 行:应避免未使用的局部变量 'n'。
|
||
建议: 删除未使用的局部变量 n。
|
||
- 🟡 `pmd:UnusedLocalVariable` L50
|
||
第 50 行:应避免未使用的局部变量 'o'。
|
||
建议: 删除未使用的局部变量 o。
|
||
- 🟡 `pmd:UnusedLocalVariable` L51
|
||
第 51 行:应避免未使用的局部变量 'p'。
|
||
建议: 删除未使用的局部变量 p。
|
||
- 🟡 `pmd:UnusedLocalVariable` L52
|
||
第 52 行:应避免未使用的局部变量 'q'。
|
||
建议: 删除未使用的局部变量 q。
|
||
- 🟡 `pmd:UnusedLocalVariable` L53
|
||
第 53 行:应避免未使用的局部变量 'r'。
|
||
建议: 删除未使用的局部变量 r。
|
||
- 🟡 `pmd:UnusedLocalVariable` L54
|
||
第 54 行:应避免未使用的局部变量 's2'。
|
||
建议: 删除未使用的局部变量 s2。
|
||
- 🟡 `pmd:UnusedLocalVariable` L55
|
||
第 55 行:应避免未使用的局部变量 't'。
|
||
建议: 删除未使用的局部变量 t。
|
||
- 🟡 `pmd:UnusedLocalVariable` L56
|
||
第 56 行:应避免未使用的局部变量 'u'。
|
||
建议: 删除未使用的局部变量 u。
|
||
- 🟡 `pmd:UnusedLocalVariable` L57
|
||
第 57 行:应避免未使用的局部变量 'v'。
|
||
建议: 删除未使用的局部变量 v。
|
||
- 🟡 `pmd:UnusedLocalVariable` L58
|
||
第 58 行:应避免未使用的局部变量 'w'。
|
||
建议: 删除未使用的局部变量 w。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L59
|
||
第 59 行:局部变量 'xx' 可声明为 final。
|
||
建议: 变量 xx 声明后未再赋值,改为 final int xx = 24;。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L60
|
||
第 60 行:局部变量 'yy' 可声明为 final。
|
||
建议: 变量 yy 声明后未再赋值,改为 final int yy = 25;。
|
||
|
||
AI 审查 · 4 条建议
|
||
|
||
- 🔴 [AI] [bug] `output-before-forward` L33
|
||
**jsp:forward 之前已经输出响应内容,可能导致转发失败**
|
||
第 23-31 行产生的 HTML 注释、div 和 out.println 输出都会先写入响应缓冲区;随后第 33 行才执行 <jsp:forward>。若缓冲区在转发前被提交,容器会抛出 IllegalStateException;即使未提交,之前输出也可能被丢弃或导致预期外的页面行为。
|
||
建议: 不要在 JSP 中直接做转发。将前置判断与转发逻辑放到 Servlet/Filter 中,通过 RequestDispatcher 转发;如果必须在 JSP 中处理,应确保转发发生在任何输出之前。
|
||
- 🟡 [AI] [design] `dead-inline-script` L8
|
||
**整段内联脚本为死代码**
|
||
第 8-19 行的 <script> 中,doMore 未被任何地方调用,doStuff 只被 doMore 引用;如果没有外部脚本通过全局函数名调用这两个函数,整段脚本实际不可达。静态检查只报告了 doMore 未使用,未指出 doStuff 也随之为死代码。
|
||
建议: 确认无外部引用后删除整个 <script> 块;如果功能在未来需要使用,应抽取到外部 JS 文件再按需引入。
|
||
- 🟡 [AI] [security] `inline-style-csp` L24
|
||
**内联 style 属性削弱内容安全策略(CSP)**
|
||
第 24 行使用 style="background-color: #f00;" 内联样式。若站点部署 CSP style-src,内联样式可能被阻止或被迫放宽策略;同时硬编码颜色难以复用和维护。
|
||
建议: 在外部样式表或页面 <style> 中定义 .error-block { background-color: #f00; },页面使用 <div class="error-block">。
|
||
- 🟡 [AI] [security] `unescaped-scriptlet-output` L30
|
||
**scriptlet 直接输出表达式,缺少 HTML 转义**
|
||
第 30 行 out.println(z)(以及第 61 行的 out.println(xx + yy))直接将表达式写入响应。当前值是常量,但若这些位置掺入任何用户可控值,会形成反射型/存储型 XSS;JSP scriptlet 不会自动转义。
|
||
建议: 优先使用 JSTL <c:out> 输出;若暂时保留 scriptlet,应使用 OWASP Java Encoder 等工具对输出编码,例如 Encode.forHtml(String.valueOf(z))。
|