использование jdbcTemplate платформы Spring для сложной фильтрации - PullRequest
0 голосов
/ 26 февраля 2011

Я использую jdbcTemplate Spring Framework для получения списка записей из БД. Теперь я хочу добавить к нему фильтрацию, добавив ограничение к запросу. Например, скажем, список представляет людей и показывает - имя, адрес электронной почты и местоположение

Оригинальный запрос

String sql = "SELECT name, email, location FROM persons WHERE status = ?"; 

в зависимости от фильтров, к нему будут добавлены ограничения

if(filters.containsKey("person_name")) {
   sql += " AND name LIKE '%" + filters.get("person_name") + "%'"; 
}

//similarly 
if(filters.containsKey("person_email")) {
  ....
}

//similarly 
if(filters.containsKey("person_location")) {
  ....
}

Таким образом, запрос будет создан и выполнен путем передачи его методу запроса объекта jdbcTemplate

this.jdbcTemplate.query(sql, new Object[] { 1 }, RowMapper<Person> rowmapper)

Меня беспокоит то, что при использовании вышеуказанного метода он становится уязвимым для внедрения, поскольку значения, к которым применяются фильтры, напрямую записываются в запросе без какого-либо экранирования.

Можно ли динамически создавать второй параметр (массив arguments) так же, как построен запрос?

Есть ли альтернативный подход для этого с использованием jdbcTemplate?

Edit: Теперь я использую StringEscapeUtils.escapeSql из org.apache.commons.lang.StringEscapeUtils для экранирования значений. Но все еще в поисках лучших методов или тех, которые уже предоставлены весной, если таковые имеются.

Спасибо

1 Ответ

3 голосов
/ 27 февраля 2011

Я считаю, что есть лучший способ.Возьмите ваш код

if (filters.containsKey("person_name")) {
   sql += " AND name LIKE '%" + filters.get("person_name") + "%'";
}

и измените его на

if (filters.containsKey("person_name")) {
   sql += " AND name LIKE '%?%";
}

Затем вы можете передать filters.get ("person_name") в вашем методе запроса.Это защитит вас от инъекционных атак.

В ответ на комментарий

Я тоже об этом думал.Но как создать массив Objects (new Object [] {..}) динамически?

Вы можете использовать java.util.List и вызвать метод toArray ().Вроде как

import java.util.List;
import java.util.ArrayList;

List<Object> args = new ArrayList<Object>();

if (filters.containsKey("person_name")) {
   sql += " AND name LIKE '%?%";
   args.add(filters.get("person_name"));
}

Тогда, когда вам нужны аргументы в виде массива

args.toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...