依据文档:
安全漏洞审计报告.md
核实范围:本地仓库ylrz_his_scrm_java
修复原则:仅对已核实存在的高危项做最小安全加固,不改动正常业务主流程;支付/登录/上传等接口在原有逻辑上增加校验或关闭后门
修复完成时间:2026-08-06
编译验证:mvn -pl fs-common,fs-framework,fs-service,fs-user-app,fs-company-app,fs-admin -am compile -DskipTests通过
审计报告列出高危约 36 项(含编号重叠)。本地核实结果如下:
| 结论 | 数量 | 说明 |
|---|---|---|
| 已确认存在并已修复 | 28 | 见下文「已修复清单」 |
| 报告描述存在,当前仓库不存在 | 4 | 高危-02/03/07/16 对应文件或接口不在本仓库 |
| 存在但未做破坏性大改(有说明) | 4 | 如 fs-company-app 全量 permitAll、部分后台垂直越权需配权限位 |
| 额外发现并已处理 | 1 | 硬编码万能短信验证码后门 |
| 编号 | 报告描述 | 核实结果 |
|---|---|---|
| 高危-02 | CrmBusinessMapper.xml orderBy 注入 |
不存在:mapper/crm 下无 CrmBusinessMapper.xml |
| 高危-03 | CrmCustomerMapper.xml ${orderBy} |
不存在:该 XML 无 ${orderBy} / ${maps.orderBy} 拼接点 |
| 高危-07 | CrmExtDetailMapper.xml 动态 DDL |
不存在:无该 Mapper 文件 |
| 高危-16 | loginByUnionId 后门 |
不存在:AppLoginController 无此接口(仅有合法微信 code 换取 unionId 流程) |
| 高危-24 | getUserInfoByUserId 无 @Login |
当前未发现该接口(或已移除),不纳入本次改动 |
| 高危-25/26 | admin 跨公司员工列表 | 与高危-21 同类;本次未做大规模权限重构,避免影响运营后台菜单权限体系,列入后续项 |
${category} — 已修复LiveDataMapper.xml L142/L192 存在 SUM(ld.${category})fs-common/.../security/SqlSafeUtils.java(validateLiveCategory)LiveDataServiceImpl#getTrendData / getCompanyTrendData 入口白名单校验page_views、unique_visitors、total_views、unique_viewers、streamsFsStoreOrderScrmMapper.xml / LiveOrderMapper.xml 等使用 ${maps.sortOrder},且位于 ORDER BY <字段> 之后,语义为 asc/descFsStoreOrderParam(his / hisStore)自定义 setSortOrderLiveOrderParam 自定义 setSortOrderSqlSafeUtils.validateOrderDirectionSortUtils.parseSort 仅校验方向,未校验字段名fs-common/.../SortUtils.java[a-zA-Z0-9_]+,方向仅允许 asc/descOssUploadSecurityUtils(安全后缀白名单,排除 html/jsp 等)fs-company/.../CommonController.javafs-admin/.../CommonController.java(含 uploadWang)fs-store/.../CommonController.javafs-company-app/.../CommonController.javafs-user-app/.../CommonController.javafs-doctor-app/.../CommonController.javafs-company/.../ChatUploadController.javauploadOSS 副本,建议继续复用 OssUploadSecurityUtilsuploadSuffix + 白名单,不再用原始文件名构造 OSS keyfs-company CommonController 等)fs-user-app/.../TalentController.java
@LoginUrlSecurityUtils.validatePublicHttpUrlCompanyUserController#addVoicePrintUrlAudioUtils.audioWAVFromUrl(fs-service/.../fastgptApi/util/AudioUtils.java)urlToFile SSRF — 已修复FastGptCollectionServiceImpl#urlToFile.tmp 后缀FsUserVideoServiceImpl#uploadVideo.mp4,临时文件固定 .tmploginByUserId / loginTest — 已修复(禁用)AppLoginController403 该接口已禁用,并打 warn 日志/** permitAll — 未改为 Spring Security 强制认证@Login + 拦截器;直接改为 anyRequest().authenticated() 会大面积打断现有 JWT 体系,属于逻辑性破坏@Login / 归属校验(见高危-28/29)fs-framework/.../SecurityConfig.java/common/uploadOSS**、/common/uploadWang**、下载类、unbindQwUserByServerIds/his/data/* 系列危险运维接口@PreAuthorize — 部分未改fs-company-app/.../FsUserController.java
changeUserInfo:校验 fs_user_company_user 归属当前销售changeUserRemark:校验归属disabled / enabled:批量校验归属fs-company-app/.../UserController.java
delMyCard:校验 card.userId == 当前用户changeUserState:管理员 + 同公司校验getUserList:补 @LoginWxPayController#wxPayNotifybreak,并增加 default 日志/store/app/wxpay/wxPayNotify;本次仍修复,防止误调用造成重复入账PayScrmController#hfPayNotifyJsonUtils.sort4JsonString + RsaUtils.verify + BasePay.HUIFU_DEFAULT_PUBLIC_KEY 先验签,失败返回 failAppLoginController
resetPassword:失败计数 ≥5 锁定 30 分钟;成功后删除验证码loginByPhone / registerByPhone:成功后删除验证码zm12345678 / getUserDefaultPassword 自动设密逻辑;无需改动SysUserController#resetPwduserService.checkUserDataScope(user.getUserId())FastJson2JsonRedisSerializer.javasetAutoTypeSupport(true) → falseSmsTServiceImpl
@Value("${tencent.cloud.secret-id/secret-key}")fs-admin/.../application.yml 增加环境变量注入占位AKIDdAdvzoQpzuOo...TENCENT_CLOUD_SECRET_IDTENCENT_CLOUD_SECRET_KEY| 项 | 说明 | 处理 |
|---|---|---|
| 硬编码万能短信验证码 | AppLoginController 原 INTERNAL_LOGIN_CODE = "EdisonX!@#.+-123",可绕过短信登录任意用户 |
已清空禁用;仅当配置非空内部码时才可能生效(当前为空) |
| 类 | 路径 | 作用 |
|---|---|---|
SqlSafeUtils |
fs-common/.../security/SqlSafeUtils.java |
排序方向 / 列名 / live category 白名单 |
UrlSecurityUtils |
fs-common/.../security/UrlSecurityUtils.java |
SSRF:协议白名单 + 拒绝内网地址 |
OssUploadSecurityUtils |
fs-common/.../security/OssUploadSecurityUtils.java |
OSS 上传后缀白名单 + 文件名穿越过滤 |
BasePay.HUIFU_DEFAULT_PUBLIC_KEY;若商户使用自定义公钥,需改为按商户配置取公钥,否则合法回调可能验签失败。/** permitAll:仍依赖方法级 @Login,遗漏注解即裸奔;建议后续统一鉴权。@PreAuthorize,避免权限点未配置导致生产不可用;建议按权限表分批治理。OssUploadSecurityUtils。@type 多态反序列化,升级后偶发反序列化失败,需观察并清理旧缓存。fs-common/src/main/java/com/fs/common/utils/security/SqlSafeUtils.java (新增)
fs-common/src/main/java/com/fs/common/utils/security/UrlSecurityUtils.java (新增)
fs-common/src/main/java/com/fs/common/utils/security/OssUploadSecurityUtils.java (新增)
fs-common/src/main/java/com/fs/common/utils/SortUtils.java
fs-service/.../live/service/impl/LiveDataServiceImpl.java
fs-service/.../hisStore/param/FsStoreOrderParam.java
fs-service/.../his/param/FsStoreOrderParam.java
fs-service/.../live/param/LiveOrderParam.java
fs-service/.../course/service/impl/FsUserVideoServiceImpl.java
fs-service/.../fastGpt/service/impl/FastGptCollectionServiceImpl.java
fs-service/.../fastgptApi/util/AudioUtils.java
fs-service/.../sms/service/impl/SmsTServiceImpl.java
fs-user-app/.../AppLoginController.java
fs-user-app/.../WxPayController.java
fs-user-app/.../store/PayScrmController.java
fs-user-app/.../TalentController.java
fs-user-app/.../CommonController.java
fs-company-app/.../CommonController.java
fs-company-app/.../CompanyUserController.java
fs-company-app/.../FsUserController.java
fs-company-app/.../UserController.java
fs-company/.../common/CommonController.java
fs-company/.../chat/ChatUploadController.java
fs-admin/.../common/CommonController.java
fs-admin/.../system/SysUserController.java
fs-admin/src/main/resources/application.yml
fs-store/.../common/CommonController.java
fs-doctor-app/.../CommonController.java
fs-framework/.../SecurityConfig.java
fs-*/.../FastJson2JsonRedisSerializer.java (27 处)
本次已对审计报告中本地可核实的高危漏洞完成加固,覆盖:
未做或需后续立项的项主要是:CRM 报告中不存在的 Mapper、后台大面积 @PreAuthorize 补齐、fs-company-app Spring Security 体系重构。
部署前请务必完成:腾讯云密钥轮换、各环境注入新密钥、汇付回调验签联调、上传白名单业务抽样回归。