【问题标题】:HQL Injection/findAll with sorting带排序的 HQL 注入/findAll
【发布时间】:2015-11-29 19:35:48
【问题描述】:

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

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

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

这是一个例子:

  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**

【问题讨论】:

  • 由于最常见的 SQL 注入攻击方式是将字符串组合在一起,能否请您也添加您当前的代码,这可能会受到攻击?
  • 使用参数化查询并不是 HQL 注入的形成方式。 query 上的字符串连接是 HQL 注入的形成方式。
  • 这就是重点。因为逻辑是串联字符串,所以容易注入。现在由于内部要求,我不能将整个查询放在一个地方。此外,不能使用“参数化查询”来清理“order by”。

标签: grails hql grails-orm


【解决方案1】:

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

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

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

或者,如果您需要更多控制,可以使用 sessionFactory 方式:

query = sessionFactory.getCurrentSession().createCriteria(DomainClass.class)
query.addOrder(Order.asc("someField"))
query.addOrder(Order.desc("someotherField"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2011-02-24
    • 2015-06-23
    相关资源
    最近更新 更多