Repository navigation
Conversation
排序字段sortField来自前端请求参数,AbstractCtrl#getSortInfo 仅做了驼峰转下划线的 格式转换后便交给MyBatis-Plus拼接进ORDER BY语句,没有做任何字符或字段校验, 角色列表接口GET /api/sysRoles因此可以把任意SQL片段带入排序子句。 处理方式: - AbstractCtrl#getSortInfo 只放行标准SQL标识符(字母开头的字母数字下划线组合), 其余取值直接按参数错误拒绝,避免排序字段被当作SQL片段执行; - 角色列表改为按角色表字段白名单排序,白名单外的排序字段回退到默认的更新时间倒序; - 排序方向改用orderByAsc/orderByDesc显式表达,不再依赖位置参数含义。 Closes jeequan#118
SysRoleControllerSortFieldTest 中仅使用了 Wrapper 接口, QueryWrapper 的导入未被使用,移除以保持编译告警干净。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
问题与验收标准
sortField#118GET /api/sysRoles的排序字段由前端参数sortField指定。后端拿到该参数后只做驼峰转下划线的格式转换,就直接拼接进 SQL 的ORDER BY子句,没有做任何字符或字段校验。传入非普通标识符的内容时,它会被当作 SQL 片段而不是列名处理(详见 SQL Injection in Jeepay Manager Role-ListsortField#118)。jeepay-core/.../ctrls/AbstractCtrl.java的getSortInfo()只做格式转换(CharSequenceUtil.toUnderlineCase),没有任何白名单校验,非法值原样透传;jeepay-manager/.../ctrl/sysuser/SysRoleController.java的list()把该值直接交给condition.orderBy(...)拼进ORDER BY,且没有「角色表可排序字段」的白名单;getSortInfo()的空值判断写成了StringUtils.isAllEmpty(sortField, sortField)(同一参数传了两次)。ORDER BY。jeepay-core的排序参数解析与jeepay-manager的角色列表排序,补回归测试。getSortInfo()在业务代码中只有角色列表这一处调用(grep确认),影响面限于该接口。改动与兼容性
AbstractCtrl.getSortInfo():新增SORT_FIELD_PATTERN(^[A-Za-z_][A-Za-z0-9_]{0,63}$),对排序字段trim后校验,只放行标准 SQL 标识符;不合法时抛BizException(ApiCodeEnum.PARAMS_ERROR, "排序字段不合法")。同时把重复传参的空值判断修正为StringUtils.isBlank(sortField)。SysRoleController.list():新增可排序字段白名单role_id/role_name/updated_at;命中白名单才使用调用方指定的列与方向(改用语义明确的orderByAsc/orderByDesc),未命中则回退到原有默认排序updated_at DESC,不再拼接外部传入的字符串。updated_at DESC默认排序」。role_id/role_name/updated_at(以及对应的驼峰写法roleId/roleName/updatedAt)全部保留。验证
mvn -pl jeepay-core,jeepay-manager -am test:BUILD SUCCESSmvn -B test:jeepay-core 14、jeepay-components-mq 4、jeepay-manager 9、jeepay-merchant 29,全部通过,BUILD SUCCESS。java.version=17,仓库 CI 使用 JDK 17)。jeepay-core/src/test/java/com/jeequan/jeepay/core/ctrls/AbstractCtrlSortFieldTest.java:覆盖非法排序字段被拒、合法驼峰字段仍映射为下划线列名、升序标记保留、排序字段缺省时返回 null。jeepay-manager/src/test/java/com/jeequan/jeepay/mgr/ctrl/sysuser/SysRoleControllerSortFieldTest.java:直接捕获 MyBatis-Plus 生成的ORDER BY片段,断言白名单字段按请求方向排序、非白名单字段回退到默认排序、带 SQL 元字符的字段被拒绝且不查库。纯单元测试,不需要数据库、Redis 或真实支付渠道。sys_type被原样拼进了ORDER BY。ORDER BY片段断言,而非页面人工观察。mvn -B test。合并前核对
dev;稳定热修复到master并关联回同步dev的计划 / PRCloses #118
Prepared with an AI coding agent.