云R记(lezijie-note0707)全面代码审查报告
审查日期:2026-04-24
项目路径:D:\乐字节\01_乐字节Java入门级项目云日记\lezijie-note0707\lezijie-note
技术栈:Java 8 + Servlet 4 + JSP + JSTL + MySQL + JDBC + UEditor + ECharts + 百度地图API + Bootstrap + jQuery + SweetAlert2 + Hutool + FastJSON + Lombok
服务器:Apache Tomcat 7.0.67 + JDK 1.8.0_45
审查统计
| 严重性 | 数量 | 说明 |
|---|---|---|
| 🔴 致命 | 3 | 必须立即修复,影响核心功能或安全 |
| 🟠 严重 | 8 | 尽快修复,存在安全风险或功能异常 |
| 🟡 中等 | 12 | 建议修复,影响代码质量或用户体验 |
| 🔵 低 | 14 | 可选修复,代码规范和优化建议 |
| ⚪ 信息 | 10 | 冗余文件、代码风格等 |
| 合计 | 47 |
一、🔴 致命问题(3个)
1.1 修改密码功能完全失效
位置:[UserService.java:244](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/java/com/lezijie/note/service/UserService.java#L244)
现象:用户修改密码时,无论输入什么旧密码都能修改成功,原密码验证逻辑完全缺失。
根因:updatePwd方法中调用userDao.queryUserByName(null)传入null作为用户名,永远查不到用户对象,导致旧密码校验被跳过。
修复方案:
// 错误代码Useruser=userDao.queryUserByName(null);// 正确代码 - 从session获取当前登录用户名StringuserName=((User)request.getSession().getAttribute("user")).getUname();Useruser=userDao.queryUserByName(userName);if(user==null){resultInfo.setCode(0);resultInfo.setMsg("用户不存在!");returnresultInfo;}1.2 Cookie 明文存储密码
位置:[UserServlet.java:216](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/java/com/lezijie/note/web/UserServlet.java#L216)
现象:用户登录时将明文密码存入 Cookie,浏览器开发者工具可直接查看。
根因:Cookie 值使用URLEncoder.encode(userName, "UTF-8") + "|" + URLEncoder.encode(userPwd, "UTF-8")格式,密码未加密。
修复方案:Cookie 中不存储密码,改为存储随机 Token,服务端维护 Token 与用户的映射关系。
1.3 生产数据库密码泄露
位置:[product/db.properties:5-9](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/resources/product/db.properties#L5)
现象:远程服务器 IP119.27.191.180和密码123456明文写在配置文件中,且该文件在版本控制中。
修复方案:将敏感信息移到环境变量或外部配置中心,不提交到版本库。
二、🟠 严重问题(8个)
2.1 XSS 漏洞 — 多处未转义输出
位置:
| 文件 | 行号 | 未转义内容 |
|---|---|---|
| index.jsp | 72-73 | ${user.nick}、${user.mood} |
| index.jsp | 83 | ${item.groupName} |
| detail.jsp | 10 | ${note.title} |
| detail.jsp | 16 | ${note.content}(仅替换了 script 标签,其他 XSS 向量未防护) |
| type/list.jsp | 32 | ${item.typeName} |
| user/info.jsp | 19 | ${user.nick}、${user.mood} |
修复方案:使用<c:out value="${xxx}"/>或${fn:escapeXml(xxx)}进行 HTML 转义。
2.2 文件路径遍历风险
位置:[UserServlet.java:125-129](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/java/com/lezijie/note/web/UserServlet.java#L125)
现象:userHead方法直接从参数imageName拼接文件路径,未校验路径遍历(如../)。
修复方案:对imageName做白名单校验,只允许字母数字和文件扩展名。
2.3 view.jsp JavaScript 拼写错误
位置:[view.jsp:168](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/webapp/note/view.jsp#L168)
现象:thi.getStatus()拼写错误,应为this.getStatus(),导致 JS 运行时错误。
修复方案:
// 错误thi.getStatus()// 正确this.getStatus()2.4 detail.jsp 非法字符
位置:[detail.jsp:2](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/webapp/note/detail.jsp#L2)
现象:第2行存在 Windows 换行符被错误插入到 JSP 标签声明中,可能导致 JSP 编译错误。
修复方案:删除非法字符,确保 taglib 声明在同一行。
2.5 条件查询互斥
位置:[NoteDao.java:58-75](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/java/com/lezijie/note/dao/NoteDao.java#L58) 和 [NoteDao.java:101-116](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/java/com/lezijie/note/dao/NoteDao.java#L101)
现象:标题、日期、类型三个搜索条件使用else if,导致互斥。如果同时传了 title 和 date,只会按 title 查询,date 条件被忽略。
修复方案:改为独立的if判断,支持多条件组合查询。
2.6 导航链接 404
位置:[index.jsp:42](file:///D:/乐字节/01_乐字节Java入门级项目云日记/lezijie-note0707/lezijie-note/src/main/webapp/index.jsp#L42)
现象:Logo 的href="main"指向不存在的 Servlet 路径,点击后 404。
修复方案:改为href="index"。
2.7 百度地图 API 密钥硬编码
位置:view.jsp:156, report/info.jsp:33
现象:百度地图 AK 密钥yrxymYTyuefnxNtXbZcMU8phABXtu6TG硬编码在前端页面中。
修复方案:将密钥移到配置文件中,通过后端接口获取。
2.8 UEditor config.js BOM 字符
位置:statics/ueditor/dialogs/template/config.js
现象:文件包含非法 BOM 字符\ufeff,可能导致 JS 解析异常。
修复方案:用无 BOM 的 UTF-8 编码重新保存文件。
三、🟡 中等问题(12个)
| # | 问题 | 位置 | 说明 |
|---|---|---|---|
| 1 | noteId 为空时仍查询 | NoteServlet.java:160-162 | 传入 null 会导致 SQL 异常 |
| 2 | SQL 数据不一致 | db_lezijie_note修改加内容.sql:81 | userId=9 密码为明文,其他为 MD5 |
| 3 | dateInfo/typeInfo 存入 Session | IndexServlet.java:103-108 | 数据不随云记增删实时更新 |
| 4 | db.properties 密码被注释掉 | develop/db.properties:9 | 运行时 dbPwd 为 null,数据库连接失败 |
| 5 | db.properties 驱动名过时 | develop/db.properties:3 | 使用旧驱动com.mysql.jdbc.Driver |
| 6 | LoginAccessFilter 放行逻辑有漏洞 | LoginAccessFilter.java:78-86 | Cookie 伪造可能绕过登录验证 |
| 7 | config.json 两份文件不一致 | config.json vs config (2).json | imageUrlPrefix 一个为 /note 一个为空 |
| 8 | WEB-INF/classes/ 下不应有 config.json | WEB-INF/classes/config.json | 编译输出目录不应手动放文件 |
| 9 | 每次请求创建新 Service 实例 | IndexServlet.java:95,101,106 | 应使用成员变量复用 |
| 10 | UserDao 冗余方法 | UserDao.java:49-84 | queryUserByName02 未被调用 |
| 11 | 错别字 “不能卫空” | UserService.java:143 | “卫” 应为 “为” |
| 12 | DBUtil 方法名拼写错误 | DBUtil.java:33 | getConnetion应为getConnection |
四、🔵 低级问题(14个)
| # | 问题 | 位置 |
|---|---|---|
| 1 | BaseDao 使用原始类型 List | BaseDao.java:142-143 |
| 2 | BaseDao 使用已弃用 APIcls.newInstance() | BaseDao.java:171 |
| 3 | 异常全用e.printStackTrace() | 多处 |
| 4 | UserService 中System.out.println | UserService.java:72 |
| 5 | User 类重复 setter | User.java:18-20 |
| 6 | SQL 注入风险(低)— LIKE 通配符未转义 | NoteDao.java:60 |
| 7 | Cookie 分隔符 ` | ` 不安全 |
| 8 | report/info.jsp 缺少 JSTL 声明 | report/info.jsp:1 |
| 9 | NoteVo 中 noteCount 类型为 long | NoteVo.java:11 |
| 10 | login.jsp c:out 输出空串无意义 | login.jsp:34-35 |
| 11 | CSS 语法错误 | login.css:10 |
| 12 | fastjson 版本过旧(1.2.62 有安全漏洞) | pom.xml:63 |
| 13 | commons-fileupload 版本过旧 | pom.xml:84 |
| 14 | 百度地图 API 版本不一致 | view.jsp vs report/info.jsp |
五、⚪ 冗余文件(10个)
| # | 文件 | 说明 |
|---|---|---|
| 1 | index (2).jsp | 旧版本,类型链接 href 为空 |
| 2 | register (2).jsp | 旧版本注册页面 |
| 3 | register (3).jsp | 旧版本注册页面 |
| 4 | type (2).js | 旧版本 JS,li 链接为空 |
| 5 | config (2).json | 旧版本 UEditor 配置,imageUrlPrefix 为空 |
| 6 | src lezijie-note20260424/ | 备份目录,不应在源码中 |
| 7 | src lezijie-note20260424-1/ | 备份目录 |
| 8 | src lezijie-note20260424-2/ | 备份目录 |
| 9 | WEB-INF/classes/config.json | 编译输出目录中的文件 |
| 10 | config.json注释错别字 “具请体看” | config.json:24 |
六、修复优先级建议
第一优先级 — 立即修复(影响核心功能)
- ✅ 修改密码功能失效(#1.1)
- ✅ view.jsp 拼写错误
thi.getStatus()(#2.3) - ✅ detail.jsp 非法字符(#2.4)
- ✅ 导航链接 404(#2.6)
- ✅ db.properties 密码被注释掉(#3.4)
第二优先级 — 尽快修复(安全风险)
- Cookie 明文密码(#1.2)
- XSS 漏洞(#2.1)
- 文件路径遍历(#2.2)
- 生产数据库密码泄露(#1.3)
第三优先级 — 计划修复(代码质量)
- 条件查询互斥(#2.5)
- noteId 空指针(#3.1)
- Session 数据不更新(#3.3)
- 删除冗余文件(#5)
第四优先级 — 可选优化
- BaseDao 泛型化
- 引入数据库连接池
- 添加日志记录
- 升级依赖版本
七、已修复问题清单
| # | 问题 | 修复状态 |
|---|---|---|
| 1 | 点击分类界面无变化(href=“”) | ✅ 已修复 |
| 2 | UEditor controller.jsp 构造函数参数错误 | ✅ 已修复 |
| 3 | UEditor imageUrlPrefix 为空导致图片无法显示 | ✅ 已修复 |
| 4 | 文件上传路径 WEb-INF 拼写错误 | ✅ 已修复 |
| 5 | 用户注册功能缺失 | ✅ 已添加 |
| 6 | 修改密码功能缺失 | ✅ 已添加(但逻辑有 bug) |
| 7 | register.jsp 页面布局问题 | ✅ 已修复 |
| 8 | login.jsp 添加注册链接 | ✅ 已修复 |
| 9 | register.jsp BOM 字符 | ✅ 已修复 |
报告生成时间:2026-04-24