# 20260922 安全扫描修改 > 针对扫描报告中免登录接口暴露、敏感信息泄露及可写风险的整改记录。 > 扫描样例:`GET /prod-api/zsjy/enrollment/info/query?examNumber=123456` 可免登返回身份证、手机号等。 ## 一、本次处理范围 | 优先级 | 项 | 处理结果 | |--------|----|----------| | P0 | `POST /rs/init/update-menu` 未授权改菜单 | **已整改** | | P0 | `/rs/init/menu`、`/clear` 登录即可写删菜单 | **已整改**(类级 `system:menu:edit`,见 `P0-rs-init全接口权限锁死整改说明.md`) | | P0 | `SysUserController` 权限注解被注释 | **已整改**(见 `P0-SysUser权限注解恢复整改说明.md`) | | P0 | `SysRole` / `SysTenant` 权限注解被注释 | **已整改**(见 `P0-SysRole-SysTenant权限注解恢复整改说明.md`) | | P0 | `SysOss` 管理越权 + 上传无白名单 | **已整改并复测通过**(见 `P0-SysOss权限与上传白名单整改说明.md`;学生角色仍误授 `system:oss:*` 属配权问题) | | P1 | 招生 query/myStatus IDOR + 完整 PII | **已整改**(见 `P1-招生报名查询双因子与脱敏整改说明.md`) | | P1 | 毕业生按学号/身份证 IDOR | **已整改**(见 `P1-毕业生信息权限恢复整改说明.md`) | | P1 | 学生信息 list/详情/导出垂直越权 | **已整改并复测通过**(见 `P1-学生信息权限恢复整改说明.md`;学生角色仍误授 `studentMsg:*` 属配权问题) | | P0 | Bucket 密码重置 + OSS 配置密钥面 | **已整改并复测通过**(见 `P0-Bucket密码与OSS配置权限恢复整改说明.md`) | | P0 | `SysClient` 客户端密钥面权限注释 | **已整改并复测通过**(见 `P0-SysClient权限恢复整改说明.md`) | | P1 | 贫困认定申请/审批垂直越权 | **已整改并复测通过**(见 `P1-贫困认定权限恢复整改说明.md`) | | P1 | 心理健康测评/预约垂直越权 | **已整改并复测通过**(见 `P1-心理健康权限恢复整改说明.md`) | | P1 | 奖助学金申请/配置垂直越权 | **已整改并复测通过**(见 `P1-奖助学金权限恢复整改说明.md`) | | P1 | 勤工俭学岗位/申请垂直越权 | **已整改并复测通过**(见 `P1-勤工俭学权限恢复整改说明.md`;学生角色仍误授部分 `workStudy*` 属配权问题) | | P1 | 出国研修/培训垂直越权 | **已整改并复测通过**(见 `P1-出国研修培训权限恢复整改说明.md`) | | P1 | 宿舍/假期留宿/操行分等垂直越权 | **已整改并复测通过**(见 `P1-宿舍假期留宿权限恢复整改说明.md`;学生角色仍误授大量宿舍相关权限,属配权问题) | | P1 | 招生就业模块(录取流程/实习等)垂直越权 | **已整改并一次复测通过**(见 `批量权限恢复与Redis清理说明.md`) | | P1 | 业务模块剩余注释权限(财务/物业/社团等) | **源码已清零并一次复测通过**(见 `批量权限恢复与Redis清理说明.md`) | | 运维 | Redis 登录 Session 坏缓存 | **已清理**(DB8 Authorization/online_tokens) | | 配权 | 学生角色误授管理权限 | **开发库已执行并复测通过**(删约 99 条;见 `收紧学生角色过宽权限.sql`) | | P0 | Swagger `/api-docs`、`/swagger-ui/**` | **已下线** | | P0 | Demo `/demo/mail/**`、`/demo/queue/delayed/**` | **已下线(运行包不再引入)** | | P0 | 招生 5 个免登接口(含扫描点名 `query`) | **已整改**(须登录) | | P1 | `GET /cas/accessToken` 密钥暴露与日志明文 | **部分整改**(前端去 secret + 日志脱敏;后端 secret 外置待做) | | P1 | `POST /rs/application/submit` 匿名滥投 | **已整改**(须登录) | --- ## 二、已完成修改明细 ### 1. P0:`POST /rs/init/update-menu` 须登录 **问题**:标注 `@SaIgnore`,未登录即可删改 `sys_menu` / `sys_role_menu`。 **修改**: - 移除 `@SaIgnore` - 增加 `@SaCheckPermission("system:menu:edit")` **文件**: - `backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsInitController.java` **验证**:未带 Token → 401;无 `system:menu:edit` → 无权限。 --- ### 2. P0:Swagger / api-docs 下线 **问题**:`security.excludes` 放行文档路径,且 `springdoc` 开启,便于枚举全量接口。 **修改**: - `springdoc.api-docs.enabled` / `swagger-ui.enabled` → `false` - 从 `security.excludes` 移除 `/api-docs`、`/swagger-ui/**`、`/v3/api-docs/**`、`/webjars/**` 等 **文件**: - `backend/ruoyi-admin/src/main/resources/application.yml` **验证**:访问 `/prod-api/swagger-ui.html`、`/prod-api/api-docs` 不可用。 --- ### 3. P0:Demo 模块下线 **问题**:`ruoyi-demo` 打入运行包,邮件、延迟队列等接口带 `@SaIgnore`。 **修改**:注释掉运行路径上所有 `ruoyi-demo` 依赖(admin + 各业务模块),Controller 不再注册。 **文件**: - `backend/ruoyi-admin/pom.xml` - `backend/ruoyi-modules/ruoyi-hq/pom.xml` - `backend/ruoyi-modules/ruoyi-rs/pom.xml` - `backend/ruoyi-modules/ruoyi-cw/pom.xml` - `backend/ruoyi-modules/ruoyi-xg/pom.xml` - `backend/ruoyi-modules/ruoyi-zsjy/pom.xml` - `backend/ruoyi-modules/ruoyi-jcbt/pom.xml` - `backend/ruoyi-modules/ruoyi-xskh/pom.xml` - `backend/ruoyi-modules/ruoyi-bzrkh/pom.xml` - `backend/ruoyi-modules/ruoyi-aqbw/pom.xml` **说明**:源码目录 `ruoyi-modules/ruoyi-demo` 仍保留,默认构建/部署不加载。 **验证**:`/prod-api/demo/mail/**`、`/prod-api/demo/queue/delayed/**` → 404。 --- ### 4. P0:招生报名相关 5 个接口须登录(扫描报告点名) **问题**:以下接口标注 `@SaIgnore`,未登录即可访问;其中 `query` 仅凭准考证号即可返回身份证、手机号、住址等敏感信息。 | 方法 | 路径 | 说明 | |------|------|------| | GET | `/zsjy/enrollment/info/query` | 按身份证/准考证查报名 | | POST | `/zsjy/enrollment/info/submit` | 学生提交报名 | | GET | `/zsjy/enrollment/info/myStatus` | 查本人报名状态 | | GET | `/zsjy/enrollment/info/colleges` | 学院列表 | | GET | `/zsjy/enrollment/info/majors/{collegeId}` | 专业列表 | **修改**: - 后端:移除上述 5 个方法的 `@SaIgnore`,走统一登录校验 - 移动端:去掉 `isToken: false`,请求携带 Token **文件**: - `backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentInfoController.java` - `mobile/src/api/enrollment.js` - `mobile/src/pages/enrollment/index.vue` **影响**:新生报名页须先登录再查询/提交;未带 Token 访问上述接口返回 401。 **验证**: - 无 Token 访问 `GET /prod-api/zsjy/enrollment/info/query?examNumber=123456` → 401 - 登录后携带 Token 可正常查询/提交 --- ### 5. P1:CAS 换票 — 前端去 secret + 日志脱敏 **问题**: - 前端写死 `CAS_CLIENT_SECRET`(虽未参与换票,但会进浏览器包) - 后端日志打印含 secret 的完整 URL、access_token、完整 profile **修改**: - 删除前端 `CAS_CLIENT_SECRET`;换票仍只调 `GET /cas/accessToken?code=...` - 前端控制台不再打印含 Token 的响应 body - `CasController` 日志仅保留 base/client_id/长度等非敏感信息;失败响应不再回传 CAS 原始报文 **文件**: - `web/src/views/login.vue` - `backend/ruoyi-admin/src/main/java/org/dromara/web/controller/CasController.java` - `docs/开发文档/统一身份认证接入说明.md`(同步说明) **对登录影响**:无(前端本未使用 secret;日志脱敏不改换票逻辑)。 **未做(后续建议)**: - 后端 `CLIENT_SECRET` 配置外置 + 向 CAS 轮换密钥 - `/cas/accessToken` IP 限流 --- ### 6. P1:`POST /rs/application/submit` 须登录 **问题**:`@SaIgnore` + `security.excludes` 放行,可匿名灌简历数据。 **修改**: - 移除 `@SaIgnore` - 从 `security.excludes` 删除 `/rs/application/submit` - 提交时绑定 `applicantId = LoginHelper.getUserId()` **文件**: - `backend/ruoyi-modules/ruoyi-rs/src/main/java/org/dromara/rs/controller/RsApplicationController.java` - `backend/ruoyi-admin/src/main/resources/application.yml` - `docs/开发文档/API/招聘模块API.md` **影响**:招聘门户投递须先登录;`/rs/job/public/**` 公开浏览不受影响。 --- ## 三、部署与验证清单 1. 重新编译打包后端(demo 依赖变更需完整构建),部署后重启。 2. 前端若已发布含 CAS secret 的旧包,需重新构建发布 `web`。 3. 移动端报名相关改动需重新发布 `mobile`。 4. 抽查: - [ ] `POST /rs/init/update-menu` 无 Token → 401 - [ ] `/swagger-ui.html`、`/api-docs` 不可用 - [ ] `/demo/mail/**` → 404 - [ ] `GET /zsjy/enrollment/info/query?examNumber=123456` 无 Token → 401 - [ ] 招生 submit / myStatus / colleges / majors 无 Token → 401 - [ ] CAS 统一认证登录仍可用 - [ ] `POST /rs/application/submit` 无 Token → 401;登录后可提交 --- ## 四、相关分项说明(可作附录查阅) | 文档 | 内容 | |------|------| | `问题整改/P0-rs-init-update-menu免登整改说明.md` | 菜单更新接口 | | `问题整改/P0-Swagger与Demo下线整改说明.md` | Swagger / Demo | | `问题整改/P1-CAS换票密钥与日志脱敏整改说明.md` | CAS | | `问题整改/P1-rs-application-submit须登录整改说明.md` | 应聘提交 | --- **文档日期**:2026-09-22 **主题**:安全扫描修改