DEBUG.WIKI
OnlineSIM:在线接收短信,虚拟号码租用
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
腾讯云;让你的想法跑起来;轻量服务器 · 建站 / Docker / API;查看产品 →

Spring Data JPA 排序字段含组合字符,合法属性也被拒绝

4.0.7的排序字符检查漏掉组合标记,部分印度文字或分解形式重音名在生成SQL前失败。4.0.8已允许Mn/Mc,不把用户排序参数交给unsafe。

升级 Spring Data JPA 后,实体里的排序属性确实存在,派生查询和 Sort.by(...) 却都报 Sort expression ... must only contain property references or aliases used in the select clause。若字段名包含天城文元音符号、泰文标记,或分解形式的重音字母,应检查4.0.7的字符白名单回归。

这个错误发生在SQL生成之前。数据库列可读、Hibernate能识别属性,都不代表排序校验接受了属性名中的每个Unicode码点。

同样看起来是一个字,码点类别可能不同

4.0.7相关检查允许字母、数字、点和下划线,却没有允许组合标记。Java标识符可以包含一部分这类字符,因此“Java编译通过”与“排序字符串通过白名单”出现了差异。

例如,预组合的 é 与 e 加组合重音看起来很接近,字符类别却不同。多种文字本来就依赖组合标记,不能靠统一去掉重音或把名字转成ASCII修复;那会改变属性身份,甚至让查询指向另一个字段。

先核对实际Spring Data JPA依赖版本、失败属性的码点与堆栈。若属性包含函数、空白或运算符,可能本来就不属于普通属性引用,不应直接归到这次字符遗漏。

正式4.0.8已纳入两类组合标记

正式4.0.8的 QueryUtils 模式已允许 Mn、Mc,对应非间距和间距组合标记。项目可以在兼容的Spring Data依赖组合中采用包含该修正的版本,并核对最终解析到的jar,而不是只修改构建文件里一处版本号。

保留框架BOM与原有Hibernate、数据库驱动组合,不为单独替换一份jar引入另一组不兼容依赖。4.0.8的源码依据也不意味着所有任意Unicode字符都应该被接受;排序表达式的原有安全限制仍有用途。

暂时不能调整依赖时,固定查询可以把审核过的 ORDER BY 写进静态JPQL @Query,保留相同属性与方向。这里的字段由开发者在源码中确定,不是把请求参数拼进查询字符串。

错误提示中的 JpaSort.unsafe(...) 不能直接用于来自HTTP参数的任意排序文本。它会绕过该项字符保护,不是只为合法组合标记开一个小口。需要动态排序时,继续使用已有的允许属性映射,不能为修复一个字段而放开全部表达式。

验证属性与排序结果

在隔离环境覆盖实际文字属性、预组合与分解形式的测试名,以及普通ASCII属性。分别检查派生OrderBy和动态Sort路径,确认通过校验后仍按正确字段和方向排序。

还要保留原来应被拒绝的函数或非法输入用例。修复的目标是接受合法属性,而不是让所有字符串都能成为排序条件;如果采用了临时静态查询,后续依赖修正后也应核对它与原接口的分页、筛选和权限条件一致。