2015-01-07 86 views
2

我有一個使用Ebean Finder對象的查詢。這是一個工作版本:用set參數ebean查詢

public static Finder<Long, Device> find = new Finder<>(Long.class, Device.class); 

public static Page<Device> find(int page, String sorting, String order) { 

    return 
      find.where() 
        .orderBy(sorting + " " + order) 
        .findPagingList(10) 
        .setFetchAhead(false) 
        .getPage(page); 
} 

但現在我想通過使用setParameter函數使SQL注入安全,我試過這個,但沒有工作。很高興知道我錯了什麼。

public static Page<Device> find(int page, String sorting, String order) { 

    return 
      find.where() 
        .orderBy(":sorting :order") 
        .setParameter("sorting", sorting) 
        .setParameter("order", order) 
        .findPagingList(10) 
        .setFetchAhead(false) 
        .getPage(page); 

} 

UPDATE:

提到here

「問題是你不能使用命名參數設置爲了在HQL(或SQL)查詢」

如果爲true,這會使我的代碼容易受到SQL注入的攻擊!那麼你的建議是什麼?

回答

2

我不能告訴Ebean的安全程度,但你可以看到,傳遞給排序依據的字符串被解析:OrderBy.java

如果我寫的,例如:

find.where() 
    .ilike("name", "%" + filter + "%") 
    .orderBy("1;DROP TABLE company") 
    .fetch("company") 
    .findPagingList(pageSize) 
    .setFetchAhead(false) 
    .getPage(page); 

我得到這個例外:

[RuntimeException: Expecting a max of 2 words in [[1;DROP, TABLE, company]] but got 3] 
+0

感謝您的源代碼,它表明,對於OrderBy屬性,不可能混淆參數! – behzad