2015-11-29 31 views
1

在我的应用程序中,通过使用QueryBuilder.groovy之类的单独脚本将第一部分(where子句)与第二部分(order by)附加在一起构建查询,因此部分的顺序是容易出现无法通过使用命名参数进行消毒的HQL注入。因此,我希望使用findAll通过分别传递查询和排序以及分页参数来检索一组记录。我见过这样的实现:HQL Injection/findAll with sorting

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

当我经过sortColumn和sortDirection作为命名的参数,sortColumn工作得很好,但sortDirection没有工作。我需要一种方法来使sortDirection作为一个命名参数或任何其他方式,它将“按方向排序”与findAll结果相结合。很多人在各种论坛上都建议直接使用参数作为查询的一部分,但对我的应用程序来说是不可接受的,因为它会将查询暴露给HQL Injection。 在此先感谢。

这里有一个例子:

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

,因为最常见的方式打开你自己来SQL注入是通过一起敲击字符串,你可以请添加你的当前代码,可以被攻击吗? – cfrick

+0

添加示例 –

+0

使用参数化查询不是如何形成HQL注入的。 * query *上的字符串连接是HQL注入的形式。 – christopher

回答

1

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

如果你想创建复杂的查询,可以考虑使用createCriteria()非常

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

,或者,如果你需要更多的控制,在SessionFactory的方式:

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