2015-09-03 4 views
0

Я хочу добавить автозаполнение для поиска в моем приложении. Для этой функции я использовал NamedQuery («userSuggest»). В JpaRepository я определяю метод («userSuggest») с одним параметром. Вот мой код:Hibernate Named Query and Spring Data SQL injection

@Entity 
@NamedQueries({ 
     @NamedQuery(name = "User.userSuggest", query = "select u from User u where u.userName like :userName") }) 
public class User implements java.io.Serializable { 

    private Integer userId; 
    private String userName; 

    setter and getter ... 
} 

и

@Repository("userRepository") 
    public interface UserRepository extends JpaRepository<User, Integer> { 
     List<Gene> userSuggest(@Param("userName") String userName); 
    } 

Я называю этот метод ввода пользователем передача данных + знак процента в качестве параметра:

userRepository.userSuggest(userInpoutData + "%"); 

Теперь проблема: когда пользователь проход «%» (userInpoutData = «%») метод возвращает весь существующий пользователь в базе данных. Как я могу предотвратить эту инъекцию SQL? Я знаю, что использование entityManager.createNamedQuery (например, How To Fix SQL Injection: JPA) решает эту проблему, но я не знаю, как ее использовать с Spring JpaRepository. Спасибо.

ответ

0

Это не SQL-инъекция. Именно из-за этого:

userRepository.userSuggest(userInpoutData + "%"); 

Таким образом, вы получите:

%% 

Попробуйте это:

if (!userInpoutData.isEmpty() && !userInpoutData.equals("%") { 
    userRepository.userSuggest(userInpoutData + "%"); 
} 
+0

Я предполагаю, что это SQL-инъекция так, чтобы решить эту проблему, я должен быть черешок подстановочные. благодаря –