chore(mhzc): apply minor review cleanups for listUserByQy

- #1 Remove unused IPage import in TxwMhzcYhxxbServiceImpl (line 17)
- #3 Reorder mapper imports: move org.apache.ibatis.annotations.Param above com.css.* (line 14)
- #4 Clarify LIKE wildcard vs SQL injection in spec §7 table and §8 step 8
- Verified: javac on both Java files compiles clean (exit 0)
- Untouched per partner decision: UserController.listUserByQy public modifier, spec structure outside §7/§8 step 8
This commit is contained in:
liulujian 2026-07-27 14:14:39 +08:00
parent 803e38232a
commit cab2d1cd37
3 changed files with 3 additions and 4 deletions

View File

@ -208,7 +208,7 @@ public CommonResult<Page<UserQyVO>> listUserByQy(@RequestBody UserQyReqVO reqVO)
| `dlzh``qymc` 都为空 | 返回所有有效用户-企业项,按 `lrrq DESC` | | `dlzh``qymc` 都为空 | 返回所有有效用户-企业项,按 `lrrq DESC` |
| 无匹配项 | `Page{records=[], total=0}`HTTP 200不抛业务异常 | | 无匹配项 | `Page{records=[], total=0}`HTTP 200不抛业务异常 |
| SQL 异常 | 由全局 `@RestControllerAdvice` 兜底返回 `CommonResult.error` | | SQL 异常 | 由全局 `@RestControllerAdvice` 兜底返回 `CommonResult.error` |
| 输入含 SQL 通配符(`%`、`_` | `#{}` 预编译参数,不会被识别为通配符,安全 | | 输入含 SQL 通配符(`%`、`_` | `#{}` 通过预编译参数阻断 SQL 注入(输入中的 `'` 无法闭合 SQL 字符串),因此整体上是**安全的**。但需注意:`#{}` 不会转义 MySQL LIKE 模式元字符(`%`、`_`),输入若含这些字符仍会按 LIKE 通配符匹配。例如输入 `100%`,末位 `%` 会被 MySQL 识别为通配符,等价于 `LIKE '%100<任意内容>%'`。对本接口使用场景(按名称/账号搜索)影响极小,但若将来需要严格字面量匹配,可在 SQL 内对参数做 `REPLACE(..., '%', '\\%')` + 显式 `ESCAPE '\\'`,或调用方自行过滤通配符。 |
## 8. 测试 ## 8. 测试
@ -221,7 +221,7 @@ public CommonResult<Page<UserQyVO>> listUserByQy(@RequestBody UserQyReqVO reqVO)
5. **多企业用户**:同一 dlzh 出现多条,每条对应一个 qymc 5. **多企业用户**:同一 dlzh 出现多条,每条对应一个 qymc
6. **过滤被锁定用户**`sdbz='Y'` 的用户不出现在结果中 6. **过滤被锁定用户**`sdbz='Y'` 的用户不出现在结果中
7. **过滤无效用户**`yxbz='N'` 的用户不出现在结果中 7. **过滤无效用户**`yxbz='N'` 的用户不出现在结果中
8. **特殊字符**:输入 `100%` 应作为字面量参与匹配,不作为 SQL 通配符 8. **特殊字符**:输入 `'%' OR '1'='1`(或类似注入尝试串)应被 `#{}` 预编译中性化,返回 HTTP 200 不报 500其中注入部分`' OR '1'='1`)因 `#{}` 不允许 `'` 闭合字符串而被作为字面量处理。需要特别注意的是:`#{}` 不会转义 LIKE 元字符,因此输入中若含 `%``_` 仍会按 MySQL 通配符匹配——例如输入 `100%` 会被解读为 `LIKE '%100<任意内容>%'`。对本按名称/账号搜索的使用场景无实际风险,但若未来需严格字面量匹配,应在 SQL 内通过 `REPLACE(...)` + 显式 `ESCAPE '\\'` 转义。
9. **分页边界**`pageSize=10`、`pageNo` 超过总页数 → 返回空 recordstotal 仍正确 9. **分页边界**`pageSize=10`、`pageNo` 超过总页数 → 返回空 recordstotal 仍正确
## 9. 不在范围内 ## 9. 不在范围内

View File

@ -2,12 +2,12 @@ package com.css.txw.mhzc.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.css.ggzc.framework.common.util.gy.GyUtils; import com.css.ggzc.framework.common.util.gy.GyUtils;
import com.css.ggzc.framework.mybatis.core.mapper.BaseMapperX; import com.css.ggzc.framework.mybatis.core.mapper.BaseMapperX;
import com.css.txw.mhzc.pojo.domain.TxwMhzcYhxxbDO; import com.css.txw.mhzc.pojo.domain.TxwMhzcYhxxbDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.css.txw.mhzc.pojo.vo.UserQyReqVO; import com.css.txw.mhzc.pojo.vo.UserQyReqVO;
import com.css.txw.mhzc.pojo.vo.UserQyVO; import com.css.txw.mhzc.pojo.vo.UserQyVO;
import com.css.txw.mhzc.pojo.vo.UserReqVO; import com.css.txw.mhzc.pojo.vo.UserReqVO;

View File

@ -14,7 +14,6 @@ import javax.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.css.ggzc.framework.common.pojo.CommonResult; import com.css.ggzc.framework.common.pojo.CommonResult;