Hibernate 命名查询和 Spring Data SQL 注入

Posted

技术标签:

【中文标题】Hibernate 命名查询和 Spring Data SQL 注入【英文标题】:Hibernate Named Query and Spring Data SQL injection 【发布时间】:2015-09-03 20:27:35 【问题描述】:

我想在我的应用中添加自动完成搜索功能。对于这个特性,我使用了 NamedQuery("userSuggest")。在 JpaRepository 中,我定义了一个带有一个参数的方法(“userSuggest”)。 这是我的代码:

@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(like How To Fix SQL Injection: JPA) 可以解决这个问题,但我不知道如何将它与 Spring JpaRepository 一起使用。 谢谢。

【问题讨论】:

【参考方案1】:

这不是 SQL 注入。正因为如此:

userRepository.userSuggest(userInpoutData + "%");

所以你得到:

%%

试试这个:

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

【讨论】:

我假设这是一个 sql 注入,所以要解决这个问题,我必须是 scape 通配符。谢谢

以上是关于Hibernate 命名查询和 Spring Data SQL 注入的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis/Hibernate/Spring Data Jpa选型对比

Hibernate命名查询

Spring Boot:使用 @DataJpaTest 和 Flyway 设置 Hibernate 命名策略

改进的命名策略不再在 Hibernate 5 中工作

Spring Boot 的 Hibernate 字段命名问题(命名策略)

Spring Boot 的 Hibernate 字段命名问题(命名策略)