gpt4 book ai didi

grails - 带排序的 HQL 注入(inject)/findAll

转载 作者:行者123 更新时间:2023-12-02 14:41:11 25 4
gpt4 key购买 nike

在我的应用程序中,查询是通过使用单独的脚本(如 QueryBuilder.groovy)将第一部分(where 子句)与第二部分(order by)附加来构建的,因此 order by 部分容易出现 HQL 注入(inject),这不能通过使用命名参数进行清理。因此,我想使用 findAll 通过分别向其传递查询以及排序和分页参数来检索一组记录。我看到了这样的实现:

     domainClass.findAll(query,[namedParams],[max: 10, offset: 5])

当我将 sortColumn 和 sortDirection 作为命名参数传递时,sortColumn 工作正常,但 sortDirection 不起作用。我需要一种方法来使 sortDirection 作为命名参数或任何其他将“按方向排序”与 findAll 结果相结合的方法。许多人在各种论坛上建议直接使用参数作为查询的一部分,但这对我的应用程序来说是 Not Acceptable ,因为它会将查询暴露给 HQL 注入(inject)。
提前致谢。

这是一个例子:
  queryString = "FROM BookCatalog b WHERE b.bookNumber = :bookNumber"

这被传递给 QueryBuilder.groovy 发生这样的事情:
  sort = "$params.sortColumn $params.sortDirection"
queryString.order(sort)

public void sort(String query){
this.query = this.query+" order by "+query
}

最后 findAll 检索记录列表:
  def list = findAll(queryString,namedParams,queryParams)

因此,由于逻辑只是将排序参数附加到查询字符串,潜在的黑客可以执行以下操作:
  bookCatalogView?offset=2&max=5&sortColumn=1,2,3 **or 1=1**

或者
  bookCatalogView?offset=2&max=5&sortColumn=1,2,3;**select * from whatever**

最佳答案

不要连接字符串,这是不好的做法。

如果要创建复杂的查询,请考虑使用 createCriteria()

SomeDomainClass.createCriteria().list {
order("propName", "desc")
}

或者,如果您需要更多控制,请以 sessionFactory 方式:
query = sessionFactory.getCurrentSession().createCriteria(DomainClass.class)
query.addOrder(Order.asc("someField"))
query.addOrder(Order.desc("someotherField"))

关于grails - 带排序的 HQL 注入(inject)/findAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33987126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com