Skip to content

参数污染问题,性能问题,SQL意外重写问题 #876

@wkclz

Description

@wkclz

场景:我的查询参数包含了 orderBy, 并且 sql 里面也包含了 orderBy, 我并没有用参数里面的 orderBy. 同时也没启用分页,但 PageHelper 把 SQL 重写错了。过程如下:

  1. com.github.pagehelper.PageInterceptor#intercept, 缺少是否 PageHelper.startPage() 的判断,导致后续多跑了很多逻辑
  2. com.github.pagehelper.util.PageObjectUtil#getPageFromObject, getParamValue过程,从参数里面获取了多项参数 (当前我是追踪了 orderBy)
  3. com.github.pagehelper.dialect.AbstractHelperDialect#getPageSql, 从 Param 里面来的 orderBy, 被成功识别并进一步处理
  4. com.github.pagehelper.parser.defaults.DefaultOrderBySqlParser#converToOrderBySql, SQL 中的 orderBy 被用语法树移除了,并且 orderBy 被重新加在了最后 (在 limit 之后)
  5. 得到 SQL: LIMIT 0, 10 order by sort, 语法错误

可考虑以下优化/修复方案:

  1. com.github.pagehelper.PageInterceptor#intercept, 先判断用户是否 startPage, 如果没有,直接放行到下一个拦截器就好,能避免后续的各种问题
  2. com.github.pagehelper.util.PageObjectUtil#getPageFromObject, 过程,不应该依赖用户的业务对象入参,只能依赖分页组件的自身入参,否则参数容易被污染
  3. com.github.pagehelper.parser.defaults.DefaultOrderBySqlParser#converToOrderBySql 需要考虑较多情况。移除 order by 用了语法树,那拼接回 order by 也应该用语法树

以上几个方案,应该都能避免这次悲剧的发生。熬夜找问题头发都没了

当然,翻看 issues, 好几个人提到了 orderBy 问题,没得到合理的解决, 希望大佬能解决此问题

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions