【发布时间】: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