2015-01-07 1 views
2

У меня есть запрос с использованием объекта Ebean Finder. это рабочая версия:ebean query with setParameter

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); 
} 

, но теперь я хочу, чтобы сделать его SQLInjection безопасным использованием функции setParameter, я попытался это, но ничего не вышло. было бы здорово узнать, что у меня не так.

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) запрос."

Если это правда, это делает мой код уязвимым для SQL-инъекции! так что вы предлагаете?

ответ

2

Я не могу сказать, насколько безопасна Ebean есть, но вы можете видеть, что строка передается OrderBy разбора: 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